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属性并不是多对多关系一定要用的,有了它只是让我们在插入或 ...
随机推荐
- .pb.h:9:42: fatal error: google/protobuf/stubs/common.h: No such file or directory
看看这个你应该知道,找不到头文件,它可用于g++ 的-I 参数: -I/usr/local/lib/protobuf/include如需订购g++在/usr/local/lib/protobuf 以上 ...
- crawler_浅谈网络爬虫
题记: 1024,今天是个程序猿的节日 ,哈哈,转为正题,从事了一线网络爬虫开发有近1000天.简单阐述下个人对网络爬虫的理解. 提纲: 1:是什么 2:能做什么 3:怎么做 4:综述 1:是什么 w ...
- 【Head First Javascript】学习笔记0——自己制作chm参考手册素材
变量声明:var 常量声明:const 数据格式转换: 1.转换函数 parseInt(A):把字符串A转换成整数:其中A为只包含数字的字符串 parseFloat(A):把字符串A转换成浮点数:其中 ...
- CSharp设计模式读书笔记(13):代理模式(学习难度:★★★☆☆,使用频率:★★★★☆)
代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. 模式角色与结构: 示例代码: using System; using System.Collections.Generi ...
- Android 2.3.5源码 更新至android 4.4,能够下载,度娘网盘
Android 4.4源代码下载(linux合并) ==============================切割线结束========================= 旧版本号的能够使用115, ...
- 完全用Linux工作,抛弃windows
录一篇旧文 作者:王垠 完全用Linux工作,抛弃windows 我已经半年没有使用 Windows 的方式工作了.Linux 高效的完成了我所有的工作. GNU/Linux 不是每个人都想用的.如果 ...
- windows+php5.5+apache2.4+tomcat+mod_jk配置
原因: 通常情况下apache执行的是80port,比方apache启动后执行localhost:80就能够出现It works页面,这里的80也能够不写,会默认的.而tomcat启动时默认的port ...
- 刚学unity3d,跟着仿作了flappy bird,记下一些琐碎的心得!
1.关于场景,即scene. 一个正常的游戏至少要有三个场景,即菜单(或者文件夹)场景.游戏关卡场景.游戏结束场景.它们一般统一放在project文件夹下scene文件夹(自己创建)中,方便管理. 1 ...
- C语言库函数大全及应用实例十一
原文:C语言库函数大全及应用实例十一 [编程资料]C语言库函数大全及应用实例十一 函数名: setbkcolor 功 能 ...
- C语言库函数大全及应用实例七
原文:C语言库函数大全及应用实例七 [编程资料]C语言库函数大全及应用实例七 函数名: getw 功 能: 从流中取一整数 用 法: int getw(FILE *strem); 程序例: #i nc ...