双向1-n与双向n-1是完全相同的两种情形

双向1-n需要在1的一端可以访问n的一端,反之亦然。

域模型:从Order到Customer的多对一双向关联需要在Order类中定义一个Customer属性,而在Customer类中需定义存放Order对象的集合属性

关系数据模型:ODDERS表中的CUSTOMER_ID参照CUSTOMER表的主键

当Session从数据库中加载Java集合时,创建的是Hibernate内置集合类的实例,因此在持久化类中定义集合属性时必须把属性声明为Java接口类型
  -Hibernate的内置集合类具有集合代理功能,支持延迟检索策略
  -事实上,Hibernate的内置集合类封装了JDK中的集合类,这使得Hibernate能够对缓存中的集合对象进行脏检查,按照集合对象的状态来同步更新数据库
在定义集合属性时,通常把它初始化为集合实现类的一个实例。这样可以提高程序的健壮性,避免应用程序访问取值为null的集合的方法抛出NullPointException

Hibernate使用<set>元素来映射set类型的属性。<set>节点中主要包括以下三个属性:

  <set>元素的inverse属性
    在Hibernate中通过inverse属性的值来决定是由双向关联的哪一方来维护表和表之间的关系。inverse=false的为主动方,inverse=true的为被动方,由主动方负责维护关联关系
    在没有设置inverse=true的情况下,父子两边都维护父子关系
    在1-n关系中,将n方设为主控方将有助于性能改善
    在1-N关系中,若将1方设为主控方
      会额外多出update语句
      插入数据时无法同时插入外键列,因为无法为外键列添加非空约束

  <set>元素的cascade属性
    在对象-关系映射文件中,用于映射持久化类之间关联关系的元素,<set>,<many-to-one>和<one-to-one>都有cascade属性,它用于指定如何操纵与当前对象关联的其他对象
    delete:通过Session的delete方法删除当前对象时,会级联删除所有关联的对象
    delete-orphan:删除所有和当前对象解除关联关系的对象
    save-update:当通过Session的save,update及saveOrUpdate方法来保存或更新当前对象时,级联保存所有关联的新建的临时对象,并且级联更新所有关联的游离对象

  <set>元素的order-by属性(在数据库中对集合排序)
    <set>元素有一个order-by属性,如果设置了该属性,当Hibernate通过select语句到数据库中检索集合对象时,利用order by子句进行排序
    order-by属性还可以加入SQL函数(DESC, ASC)

-------------------------------示例代码-------------------------------------------------------------------------------------------------------------

Customer

 1 package com.yl.hibernate.entities.n21.both;
 2
 3 import java.util.HashSet;
 4 import java.util.Set;
 5
 6 public class Customer {
 7
 8     private Integer customerId;
 9     private String customerName;
10     /**
11      * 1.声明集合类型时,需使用接口类型,因为hibernate在获取集合类型时,返回的是Hibernate内置的集合类型,而不是JavaSE一个标准的集合
12      * 2.需要把集合进行初始化,可以防止发生空指针异常
13      */
14     private Set<Order> orders = new HashSet<Order>();
15
16     public Integer getCustomerId() {
17         return customerId;
18     }
19     public void setCustomerId(Integer customerId) {
20         this.customerId = customerId;
21     }
22     public String getCustomerName() {
23         return customerName;
24     }
25     public void setCustomerName(String customerName) {
26         this.customerName = customerName;
27     }
28     public Set<Order> getOrders() {
29         return orders;
30     }
31     public void setOrders(Set<Order> orders) {
32         this.orders = orders;
33     }
34
35
36 }

Order

 1 package com.yl.hibernate.entities.n21.both;
 2
 3 public class Order {
 4
 5     private Integer orderId;
 6     private String orderName;
 7
 8     private Customer customer;
 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 getOrderName() {
19         return orderName;
20     }
21
22     public void setOrderName(String orderName) {
23         this.orderName = orderName;
24     }
25
26     public Customer getCustomer() {
27         return customer;
28     }
29
30     public void setCustomer(Customer customer) {
31         this.customer = customer;
32     }
33
34
35 }

Customer.hbm.xml

 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 2014-11-26 19:19:40 by Hibernate Tools 3.4.0.CR1 -->
 5 <hibernate-mapping>
 6     <class name="com.yl.hibernate.entities.n21.both.Customer" table="CUSTOMERS">
 7         <id name="customerId" type="java.lang.Integer">
 8             <column name="CUSTOMER_ID" />
 9             <generator class="native" />
10         </id>
11         <property name="customerName" type="java.lang.String">
12             <column name="CUSTOMER_NAME" />
13         </property>
14
15         <!-- 映射1对多的那个集合属性 -->
16         <!-- set: 映射set类型的属性,table:set中的元素对应的记录放在哪一个数据表中,该值需要和多对一的多的那个表的名字一致 -->
17         <!-- inverse:指定由哪一方来维护映射关系。通常设置为true,以指定由多的一方来维护关联关系 -->
18         <!-- cascade:设定级联操作。 开发时不建议设定该属性。建议使用手工的方式来处理
19             delete
20             delete-orphan
21             save-update
22         -->
23         <!-- order-by 在查询时对集合中的元素排序,order-by中使用的是表的字段名,而不是持久化类的属性名 -->
24         <set name="orders" table="ORDERS" inverse="true" cascade="delete-orphan" order-by="ORDER_NAME DESC">
25             <!-- key:指定多的表汇总的外键列的名字 -->
26             <key column="CUSTOMER_ID"></key>
27             <!-- 指定映射类型 -->
28             <one-to-many class="com.yl.hibernate.entities.n21.both.Order"/>
29         </set>
30     </class>
31 </hibernate-mapping>

Order.hbm.xml

 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 2014-11-26 19:19:40 by Hibernate Tools 3.4.0.CR1 -->
 5 <hibernate-mapping>
 6     <class name="com.yl.hibernate.entities.n21.both.Order" table="ORDERS">
 7         <id name="orderId" type="java.lang.Integer">
 8             <column name="ORDER_ID" />
 9             <generator class="native" />
10         </id>
11         <property name="orderName" type="java.lang.String">
12             <column name="ORDER_NAME" />
13         </property>
14         <!-- 映射多对一的映射关系。使用many-to-one 来映射多对一的关联关系
15             name:多这一端关联的一那一端的属性的名字
16             class:一那一端的属性对应的类名
17             column:一那一端在多的一端对应的数据表中的外键的名字
18          -->
19         <many-to-one name="customer" class="com.yl.hibernate.entities.n21.both.Customer" column="CUSTOMER_ID">
20         </many-to-one>
21
22     </class>
23 </hibernate-mapping>

转载于:https://www.cnblogs.com/dreamfree/p/4127218.html

Hibernate4.x之映射关系--双向1-n相关推荐

  1. Hibernate映射关系

    为什么80%的码农都做不了架构师?>>>    前言 Hibernate Annotation关系映射有下面几种类型: 一对一外键关联映射(单向) @OneToOne(cascade ...

  2. java框架篇---hibernate(一对多)映射关系

    一对多关系可以分为单向和双向. 一对多关系单向 单向就是只能从一方找到另一方,通常是从主控类找到拥有外键的类(表).比如一个母亲可以有多个孩子,并且孩子有母亲的主键作为外键.母亲与孩子的关系就是一对多 ...

  3. 【Hibernate】映射关系总结

    在hibernate中,由于是对对象进行操作,但是要实现表与表之间的关系,是怎么样实现的呢? 一.Hibernate的映射 Hibernate是对对象进行操作,Hibernate的映射是描述数据库表的 ...

  4. Hibernate映射关系总结篇

    又从头学习了一遍hibernate的映射关系,每一次都会有新的收获,总是感觉自己还是不会hibernate.单从配置上说:知其然不知其所以然,马上就要找工作的人了,很是为自己担心呀!! 众所周知,hi ...

  5. hibernate注解方式来处理映射关系

    在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式 ...

  6. hibernate annotation注解方式来处理映射关系

    2019独角兽企业重金招聘Python工程师标准>>> 在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟 ...

  7. Hibernate→HQL、query.list()返回数据类型、查询相关语句、分页、原生SQL、@注解、持久化对象状态及生命周期、一多关系、继承映射关系、逆向工程

    HQL Query实例与表 session通用工具类 Query对象 from 类→List<类>接收 映射类 仅查询商品 查询商品及所在商家 别名 返回数据类型定义 Iterator接收 ...

  8. Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!...

    前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...

  9. Hibernate(六)一对一映射关系

    One to One 映射关系(只有当映射自定义对象时,才会用,hibernate支持的java类型都可直接设成属性,了解第一和第二种的xml即可) 基于外键的单向一对一 (xml和annotatio ...

最新文章

  1. windows7升级安装之初体验
  2. python3 执行系统命令
  3. MFC90条技巧-带目录
  4. 【WebRTC---序篇】(二)Windows平台WebRTC源码编译
  5. bwa比对软件的使用以及其结果文件(sam)格式说明
  6. 澳洲虚拟主机空间_澳洲空间|澳洲虚拟主机|澳洲主机|澳洲虚拟空间-万纵科技 www.xmwzidc.cn...
  7. Emacs 下安装 python-mode.el
  8. C# 生成高清缩略图
  9. Storm实战常见问题及解决方案
  10. 关于震旦AD248B双面打印
  11. qsnctf 2048 wp
  12. Excel·VBA数组冒泡排序函数
  13. WordPress自动采集发布文章02-软件批量伪原创
  14. BFS(宽度优先算法)
  15. K3WISE老单序时簿开发示例:增加功能性按钮
  16. docker.socks vul
  17. dhtml、html、html5、xml、xhtml的区别
  18. 微众银行为甘肃省职业院校技能大赛“区块链技术与应用”赛项提供技术支持
  19. 3dmax文件打不开了,怎么办
  20. 设计模式Java语言实现之策略模式

热门文章

  1. java 浮点数精度_Java中浮点数精度问题
  2. python jupyter安装_python之jupyter的安装
  3. oracle 连续5分钟_3-1!10分钟3球杀入前四,连续5个客场大逆转,名字叫曼联
  4. QT 定时器与动画实现
  5. ACM竞赛学习整理开篇之01背包问题
  6. 漂亮的花样边框html代码,手把手教你制作精美边框素材HTML代码
  7. html右侧隐藏功能区,html – CSS功能区上的三角形阴影
  8. 多线程存数据mysql_java 多线程存储数据库
  9. python string模块安装_python String模块-阿里云开发者社区
  10. 哪些人不适合去做科研(转)