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属性并不是多对多关系一定要用的,有了它只是让我们在插入或 ...
随机推荐
- 1006-HBase操作实战(JAVA API状态)
一.准备阶段 开发环境: hadoop: hadoop -2.4.0 hbase: hbase -0.94.11-security eclipse:Juno Service Release 2 二.创 ...
- Java EE (1) -- Java EE 6 Web Component Developer Certified Expert(1z0-899)
1: hash map, hash tables 的区别 The HashMap class is roughly equivalent to Hashtable, except that it is ...
- 浏览器扩展系列————在WPF中定制WebBrowser快捷菜单
原文:浏览器扩展系列----在WPF中定制WebBrowser快捷菜单 关于如何定制菜单可以参考codeproject上的这篇文章:http://www.codeproject.com/KB/book ...
- C/S模式开发中如何利用WebBrowser控件制作导航窗体
原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见 ...
- lambda 表达式 自定义查询
遇到 这样的 问题 常用 EF . 实现 like 用 Contains("asd") 搞定 他生成的是 %asd% . 如果 我希望 生成 asd%,怎么搞呢? Start ...
- pyqt学习总结
一.学习来由: 近期一段时间,应朋友的须要,完毕一款抓取软件.一般而言,python是我比較熟悉的语言,又有丰富的抓取和解析模块,所以果断选择之. 而这远远不是重点,后台程序在工作做常常写,所以比較熟 ...
- 日积月累系列之分页控件(js源码)
最近开发了一款分页控件,分享给大家. 主要功能和界面介绍 cform分页控件支持服务端分页.客户端分页.数据过滤.数据排序等功能. 源码介绍 cform-pager分页控件主要由三部分组成:css.s ...
- MvcPager分页控件以适用Bootstrap
随笔- 9 文章- 0 评论- 33 修改MvcPager分页控件以适用Bootstrap 效果(含英文版,可下载) 软件开发分页效果必不可少,对于Asp.Net MVC 而言,MvcPag ...
- C语言实现全排列
实现全排列,递归实现 #include <stdio.h> #include <stdlib.h> ; void swap(int *a, int *b) { int m; m ...
- js预解析问题总结
//示例 1 alert(a) // undefind. alert(fn) // function 整个函数块. var a = 1; function fn(){ return falss; }; ...