Hibernate:如何映射聚合?
Hibernate:如何映射聚合?
目录
背景返回目录
DDD 是在 Hibernate 之后发现的概念,Hibernate 如何映射 DDD 中的聚合呢?本文给出一种思路。
参考资料:DDD:使用EntityFramework的话,如果只为聚合根设计仓储,其它实体如何处理?。
映射聚合返回目录
聚合模型返回目录
Order
1 package model;
2
3 import java.util.*;
4
5 public class Order {
6 private Integer orderId;
7 private String customer;
8 private Set<OrderItem> orderItems = new HashSet<OrderItem>();
9
10 public Integer getOrderId() {
11 return orderId;
12 }
13
14 public void setOrderId(Integer orderId) {
15 this.orderId = orderId;
16 }
17
18 public String getCustomer() {
19 return customer;
20 }
21
22 public void setCustomer(String customer) {
23 this.customer = customer;
24 }
25
26 public Set<OrderItem> getOrderItems() {
27 return orderItems;
28 }
29
30 public void setOrderItems(Set<OrderItem> orderItems) {
31 this.orderItems = orderItems;
32 }
33
34 }
OrderItem
1 package model;
2
3 import java.io.Serializable;
4
5 public class OrderItem implements Serializable {
6 private static final long serialVersionUID = 8584993780461202406L;
7 private Integer orderId;
8 private Integer productId;
9 private String product;
10
11 public Integer getProductId() {
12 return productId;
13 }
14
15 public void setProductId(Integer productId) {
16 this.productId = productId;
17 }
18
19 public String getProduct() {
20 return product;
21 }
22
23 public void setProduct(String product) {
24 this.product = product;
25 }
26
27 public Integer getOrderId() {
28 return orderId;
29 }
30
31 public void setOrderId(Integer orderId) {
32 this.orderId = orderId;
33 }
34 }
映射配置返回目录
Order
1 <?xml version="1.0"?>
2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
4 <!-- Generated 2013-10-7 21:33:57 by Hibernate Tools 3.4.0.CR1 -->
5 <hibernate-mapping>
6 <class name="model.Order" table="Orders">
7 <id name="orderId" type="java.lang.Integer">
8 <column name="OrderId"/>
9 <generator class="identity"/>
10 </id>
11 <property generated="never" lazy="false" name="customer" type="java.lang.String">
12 <column name="Customer"/>
13 </property>
14 <set cascade="all,delete-orphan" inverse="true" lazy="true"
15 name="orderItems" sort="unsorted" table="OrderITems">
16 <key>
17 <column name="OrderId"/>
18 </key>
19 <one-to-many class="model.OrderItem"/>
20 </set>
21 </class>
22 </hibernate-mapping>
OrderItem
1 <?xml version="1.0"?>
2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
4 <!-- Generated 2013-10-7 21:33:57 by Hibernate Tools 3.4.0.CR1 -->
5 <hibernate-mapping>
6 <class name="model.OrderItem" table="OrderItems">
7 <composite-id>
8 <key-property name="orderId">
9 <column name="OrderId"/>
10 </key-property>
11 <key-property name="productId">
12 <column name="ProductId"/>
13 </key-property>
14 <generator class="assigned"/>
15 </composite-id>
16 <property generated="never" lazy="false" name="product" type="java.lang.String">
17 <column name="Product"/>
18 </property>
19 </class>
20 </hibernate-mapping>
重点注意:Order 的 set 指定了 cascade="all 和 delete-orphan" inverse="true",OrderItem 使用了双主键(不是必须的)。
测试返回目录
代码
1 package demo;
2
3 import model.*;
4
5 import org.hibernate.*;
6
7 /*
8 * 测试 聚合设计。
9 */
10 public class AggregateDemo implements Demo {
11
12 @Override
13 public void run() {
14 SessionHelper.execute(new SessionAction() {
15
16 @Override
17 public void action(Session session) {
18 Order order = new Order();
19 order.setCustomer("段光伟");
20 session.save(order);
21
22 OrderItem item = new OrderItem();
23 item.setOrderId(order.getOrderId());
24 item.setProductId(1);
25 item.setProduct("苹果");
26 order.getOrderItems().add(item);
27 }
28
29 });
30
31 SessionHelper.execute(new SessionAction() {
32
33 @Override
34 public void action(Session session) {
35 Order order = (Order) session.get(Order.class, new Integer(1));
36 order.getOrderItems()
37 .remove(order.getOrderItems().toArray()[0]);
38 }
39
40 });
41 }
42 }
输出SQL
1 begin transaction
2 action
3 Hibernate:
4 /* insert model.Order
5 */ insert
6 into
7 Orders
8 (Customer)
9 values
10 (?)
11 flush and commit
12 Hibernate:
13 /* get current state model.OrderItem */ select
14 orderitem_.OrderId,
15 orderitem_.ProductId,
16 orderitem_.Product as Product3_16_
17 from
18 OrderItems orderitem_
19 where
20 orderitem_.OrderId=?
21 and orderitem_.ProductId=?
22 Hibernate:
23 /* insert model.OrderItem
24 */ insert
25 into
26 OrderItems
27 (Product, OrderId, ProductId)
28 values
29 (?, ?, ?)
30 begin transaction
31 action
32 Hibernate:
33 /* load model.Order */ select
34 order0_.OrderId as OrderId1_17_0_,
35 order0_.Customer as Customer2_17_0_
36 from
37 Orders order0_
38 where
39 order0_.OrderId=?
40 Hibernate:
41 /* load one-to-many model.Order.orderItems */ select
42 orderitems0_.OrderId as OrderId1_17_1_,
43 orderitems0_.OrderId as OrderId1_16_1_,
44 orderitems0_.ProductId as ProductI2_16_1_,
45 orderitems0_.OrderId as OrderId1_16_0_,
46 orderitems0_.ProductId as ProductI2_16_0_,
47 orderitems0_.Product as Product3_16_0_
48 from
49 OrderItems orderitems0_
50 where
51 orderitems0_.OrderId=?
52 flush and commit
53 Hibernate:
54 /* delete model.OrderItem */ delete
55 from
56 OrderItems
57 where
58 OrderId=?
59 and ProductId=?
备注返回目录
还有几个问题还没有深入想:
- 如何聚合的关联层次很大,聚合根之外的实体的主键的数量也需要相应的增加,开发是否方便呢?还无从验证。
- 是否有必要为聚合根之外的实体引入一个逻辑主键,这种模式只有 Hibernate 支持,EntityFramework 就不支持。
- 使用 bag + composite-element 是否也可以?效率会不会太低。
希望朋友们多给点建议。
Hibernate:如何映射聚合?的更多相关文章
- hibernate的映射类型
hibernate的映射类型 hibernate MySQL映射类型 1.Hibernate的映射类型 hibernate mysql映射类型 Hibernate 映射类型 Java 类型 标准 SQ ...
- Hibernate关联映射关系
Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...
- 攻城狮在路上(壹) Hibernate(九)--- Hibernate的映射类型
Hibernate采用映射类型作为Java类型和SQL类型的桥梁,对应type属性.分为两种:内置映射类型和客户化映射类型.一.内置映射类型: 1.Java基本类型的Hibernate映射类型: Ja ...
- Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长:
Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长: 通过Hibernate注解的方式映射oracel数据库的sequence主键生成器 ...
- Oracle primary,unique,foreign 区别,Hibernate 关联映射
Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...
- Hibernate基础映射
在说Hibernate映射前,我们先来了解下对象关系映射 ORM.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现.这样开发人员就可以把对数据库的操作转化为对这些对象的操作.我们 ...
- Hibernate关联关系映射
1. Hibernate关联关系映射 1.1. one to one <class name="Person"> <id name="id" ...
- Hibernate学习笔记-Hibernate关系映射
1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...
- hibernate集合映射inverse和cascade详解
hibernate集合映射inverse和cascade详解 1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或 ...
随机推荐
- Sql使用视图(简单的视图)适合入门-level
创建以便从库更好的数据呼叫和一个数据库,以(例如,该209东东库转移205图书馆) 例:209图书馆有不同的库名:数据库(AIS20140417092531电影库)供应商表(t_Supplier ). ...
- 如何利用百度音乐播放器的API接口来获取高音质歌曲
第一步:在网页中打开以下网址: http://box.zhangmen.baidu.com/x?op=12&count=1&title=时间都去哪儿了$$王铮亮$$$$ 其中红色地方可 ...
- PHP经验——获得PHP版本信息及版本比较
原文:PHP经验--获得PHP版本信息及版本比较 偶然看到别人写的一句代码: <?php if (version_compare("5.2", PHP_VERSION, &q ...
- 新服务器部署sqlserver之前的准备
当你有一个新的服务器需要部署的时候,如果没有部署过的经验很可能会走很多误区,并且给以后的维护工作加大难度,我在这就把我部署服务器的一些经验跟大家分享一下. 1.登陆服务器以后先将物理盘按照64k为分配 ...
- Java遍历解析URL类型字符串中参数
public static void main(String[] args) { String str="&emailCheckURL=447&useremail=vip@c ...
- MVC页面声命周期
MVC页面声命周期 ASP.Net请求处理机制初步探索之旅 - Part 4 WebForm页面生命周期 开篇:上一篇我们了解了所谓的请求处理管道,在众多的事件中微软开放了19个重要的事件给我们, ...
- javascript2
代码变化一:<script> function abs(){ var x; if(x>0){ return x; } else{ return -x; } } console.log ...
- curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in
当系统开启safe_mode和 open_basedir,在程序中使用以下语句 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 并且遇到301,302状态 ...
- LibVLC video controls
原文 http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__video.html VLC 3.0.0-git ...
- C# 我的注册表操作类
using System; using System.Collections.Generic; using System.Text; using Microsoft.Win32; using Syst ...