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=?

备注返回目录

还有几个问题还没有深入想:

  1. 如何聚合的关联层次很大,聚合根之外的实体的主键的数量也需要相应的增加,开发是否方便呢?还无从验证。
  2. 是否有必要为聚合根之外的实体引入一个逻辑主键,这种模式只有 Hibernate 支持,EntityFramework 就不支持。
  3. 使用 bag + composite-element 是否也可以?效率会不会太低。

希望朋友们多给点建议。

 
分类: Hibernate

Hibernate:如何映射聚合?的更多相关文章

  1. hibernate的映射类型

    hibernate的映射类型 hibernate MySQL映射类型 1.Hibernate的映射类型 hibernate mysql映射类型 Hibernate 映射类型 Java 类型 标准 SQ ...

  2. Hibernate关联映射关系

    Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...

  3. 攻城狮在路上(壹) Hibernate(九)--- Hibernate的映射类型

    Hibernate采用映射类型作为Java类型和SQL类型的桥梁,对应type属性.分为两种:内置映射类型和客户化映射类型.一.内置映射类型: 1.Java基本类型的Hibernate映射类型: Ja ...

  4. Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长:

    Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长: 通过Hibernate注解的方式映射oracel数据库的sequence主键生成器 ...

  5. Oracle primary,unique,foreign 区别,Hibernate 关联映射

    Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...

  6. Hibernate基础映射

    在说Hibernate映射前,我们先来了解下对象关系映射 ORM.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现.这样开发人员就可以把对数据库的操作转化为对这些对象的操作.我们 ...

  7. Hibernate关联关系映射

    1.  Hibernate关联关系映射 1.1.  one to one <class name="Person"> <id name="id" ...

  8. Hibernate学习笔记-Hibernate关系映射

    1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...

  9. hibernate集合映射inverse和cascade详解

    hibernate集合映射inverse和cascade详解   1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或 ...

随机推荐

  1. C# Email邮件发送,功能是密码找回或者重置功能。

    原文:C# Email邮件发送,功能是密码找回或者重置功能. 最近根据公司需求,写个邮件发送.   这里面的传入的地址信息的参数都是经过加密的.  主要是保证用户信息的安全. 帮助类   using ...

  2. Java设计模式论述

    为何须要设计模式: 模式是做事的方法,是实现目标,研磨技术的方法.这样的对高效技术不懈追求的思想,广泛见于诸多领域,比如制作精美佳肴的过程.对于不论什么一种迈向成熟的全新技艺,身处这个行业的人都须要寻 ...

  3. Silverlight 雷达图和一种特殊泡泡画法

    原文:Silverlight 雷达图和一种特殊泡泡画法 自上次发了雷达图,也没怎么说一下. 这次又做了一种图,继续共享一下,就是以一个点为中心,周围绕着几个点,用一个箭头与中心相连并带有某些信息.圆 ...

  4. ActionScript GifPlayer的修改

    ActionScript不能播放gif格式的图片,在做as项目的时候如果需要用到加载gif动画图片时,就需要引入第三方包. 常用的第三方包是GifPlayer,在github上可以找到该项目的源代码C ...

  5. C#yield return和yield break

    C#yield return和yield break 晚上好,各位.今天结合书中所讲和MSDN所查,聊下yield关键字,它是我们简化迭代器的关键. 如果你在语句中使用了yield关键字,则意味着它在 ...

  6. MVC5 + EF6 + Bootstrap3 (8) HtmlHelper

    MVC5 + EF6 + Bootstrap3 (8) HtmlHelper用法大全(上) 上一节:MVC5 + EF6 + Bootstrap3 (7) Bootstrap的栅格系统 源码下载:点我 ...

  7. leetcode[55] Merge Intervals

    题目:给定一连串的区间,要求输出不重叠的区间. Given a collection of intervals, merge all overlapping intervals. For exampl ...

  8. leetcode第38题--Combination Sum

    题目: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C  ...

  9. 项目管理工具 Redmine 安装试用手记

    原文:项目管理工具 Redmine 安装试用手记 项目管理工具 Redmine 安装试用手记 分类: Redmine2009-06-01 10:12 996人阅读 评论(1) 收藏 举报 项目管理工具 ...

  10. html postMessage 创建聊天应用

    应用说明: 这个例子演示如何在门户页面以iframe方式嵌入第三方插件,示例中使用了一个来域名下的应用部件,门户页面通过postMessage来通信.iframe中的聊天部件通过父页面标题内容的闪烁来 ...