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

•双向 1-n 需要在1的一端可以访问n的一端,反之依然.

测试实例代码:

实体类:

package com.elgin.hibernate.nto1both;

public class Order {

	private int orderId;
private String orderName;
private Customer customer;
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
}
package com.elgin.hibernate.nto1both;

import java.util.HashSet;
import java.util.Set; public class Customer { private int customerId;
private String customerName;
/**
* 1.需要把集合初始化,可以防止发生空指针异常
* 2.声明集合时,需使用接口类型,因为hibernate在获取集合类型时
* 返回的是hibernate内置的集合类型,而不是JAVASE标准的集合实现
*
* */
private Set<Order> orders=new HashSet<Order>(); public int getCustomerId() {
return customerId;
}
public void setCustomerId(int customerId) {
this.customerId = customerId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public Set<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
} }

实体类对应的hbm映射文件:

Order.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-9-21 20:58:02 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="com.elgin.hibernate.nto1both">
<class name="Order" table="ORDERS">
<id name="orderId" type="int">
<column name="ORDER_ID" />
<generator class="native" />
</id>
<property name="orderName" type="java.lang.String">
<column name="ORDER_NAME" />
</property>
<!--
映射多对一关联关系 使用many-to-one映射多对一关联关系
name:多这一端关联一的那一端的属性名
class:一那一端对应的类名
column:一那一端对应多的一端对应的数据表中字段的名字
-->
<many-to-one name="customer" class="Customer">
<column name="CUSTOMER_ID" />
</many-to-one>
</class>
</hibernate-mapping>

Customer.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-9-21 20:58:02 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="com.elgin.hibernate.nto1both">
<class name="Customer" table="CUSTOMERS">
<id name="customerId" type="int">
<column name="CUSTOMER_ID" />
<generator class="native" />
</id>
<property name="customerName" type="java.lang.String">
<column name="CUSTOMER_NAME" />
</property>
<!-- 映射一对多的集合属性 -->
<!-- Set节点:用来映射 set类型的属性
table:set中的元素对应的记录放在那一个数据表中,该值需要跟n这一端的表名一致
key:n的这一端表中关联1的一端外键列的名字
one-to-many:指定映射类型
inverse:设定由那一方来维护关联关系,通常设置为true,指定由多的一方来维护关联关系
order-by属性:查询时对集合中的元素进行排序,属性值为标的字段名
-->
<set name="orders" table="ORDERS" inverse="true" order-by="">
<key column="CUSTOMER_ID"></key>
<one-to-many class="Order"/>
</set>
</class>
</hibernate-mapping>

Junit 单元测试类:

/*
*双向n-1与1-n (完全相同的2种情形)
*/
@Test
public void testMany2OneBothSave(){
Customer customer=new Customer();
customer.setCustomerName("AAaa"); Order order1=new Order();
order1.setOrderName("order-115");
order1.setCustomer(customer); Order order2=new Order();
order2.setOrderName("order-116");
order2.setCustomer(customer); customer.getOrders().add(order1);
customer.getOrders().add(order2); //先插入customer,发出3条insert语句, 2条update语句
//因为1的一端和n的一端都维护关联关系,所以会多出2条update语句
//可以在1的一端set节点指定属性inverse="true"来制定让1的一端放弃维护关联关系
//建议设定inverse="true",建议先插入1的一端,再插入多的一端
session.save(customer);
session.save(order1);
session.save(order2);
//先插入order,发出3条insert语句, 4条update语句 ,推荐先插入 customer
// session.save(order1);
// session.save(order2);
// session.save(customer);
} @Test
public void testOne2ManyBothGet(){
//1、对n的一端的集合采用延迟加在
Customer customer=(Customer) session.get(Customer.class, 1);
System.out.println(customer.getCustomerName());
//2、返回的n的一端的集合类型是Hibernate内置的集合类型
// 该类型具有延迟加载和存放代理对象的功能
//3、同样在需要使用集合中元素的时候初始化,如果此时session已关闭,会抛出懒加载异常
System.out.println(customer.getOrders().getClass().getName());
}

Hibernate关联关系之双向1—n的更多相关文章

  1. hibernate多对一双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  2. hibernate关联关系笔记

    Hibernate关联关系笔记 单向N:1 *  有连接表:在N方使用<join>/<many-to-one>.1方无需配置与之关联的持久化类. *  没有连接表:在N方使用& ...

  3. 【Hibernate步步为营】--双向关联一对一映射具体解释(一)

    一对一的映射在对象模型中是常常见到的,为了将对象模型转换为关系模型就必须在映射文件里进行配置,上篇文章讨论了一对一映射的单向关联的情况,重点是<one-to-one>标签的使用,须要在映射 ...

  4. hibernate one-to-many many-to-one 双向注解

    建表语句: DROP TABLE IF EXISTS `t_company`; CREATE TABLE `t_company` ( `companyId` ) unsigned NOT NULL A ...

  5. Hibernate关联关系映射

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

  6. Hibernate学习笔记(3)---hibernate关联关系映射

    一对一关联 假设有两个持久化类(实体类)User与Address,它们之间存在一对一的关系 1,通过主键关联(个人偏向另外一种) User.hbm.xml文件配置 <id name=" ...

  7. hibernate关联关系的crud2

    hibernate关联关系的CRUD操作,解释都在注释里了,讲了fetchType.cascade. User类: package com.oracle.hibernate; import javax ...

  8. Hibernate 关联关系(一对多)

    Hibernate 关联关系(一对多) 1. 什么是关联(association) 1.1 关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性.例如: class B ...

  9. Java进阶知识12 Hibernate多对多双向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,老师也知道自己教哪些学生时,可用双向关联 1.2.创建Teacher类和Student类 ...

随机推荐

  1. 极客编程必备的五大PHP开发应用

    有了PHP应用可以帮助编码爱好者事半功倍,提升项目质量:有了这些最新的且灵活的PHP应用使创建编码项目更加简单.便捷.本文,我们收集了五大最新的PHP开发应用. PHP应用在网络上并不多见.最重要的是 ...

  2. 三星原厂就K9K8G08U0D升级为K9K8G08U0E的回信

     1. please check the below timing first. K9F1G08U0E vs K9F1G08U0D Timing difference tR tPROG tBERS N ...

  3. ER模型到关系模型的转换规则

    E-R模型向关系模型的转换规则: 一.两元联系的转换规则 (1)实体类型的转换 将每个实体类型转换成一个关系模式,实体的属性即为关系的属性,实体标识符即为关系的键. (2)联系类型的转换 a实体间的联 ...

  4. [IE编程] 多页面基于IE内核浏览器的代码示例

    有不少人发信问这个问题,我把答案贴在这里: 建议参考 WTL (Windows Template Library) 的代码示例工程TabBrowser  (在WTL目录/Samples/TabBrow ...

  5. LA 4728 (旋转卡壳) Squares

    题意: 求平面上的最远点对距离的平方. 分析: 对于这个数据量枚举肯定是要超时的. 首先这两个点一定是在凸包上的,所以可以枚举凸包上的点,因为凸包上的点要比原来的点会少很多,可最坏情况下的时间复杂度也 ...

  6. 让IE6下支持固定定位

    让IE下支持固定定位 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// ...

  7. UVa 10129 Play On Words【欧拉道路 并查集 】

    题意:给出n个单词,问这n个单词能否首尾接龙,即能否构成欧拉道路 按照紫书上的思路:用并查集来做,取每一个单词的第一个字母,和最后一个字母进行并查集的操作 但这道题目是欧拉道路(下面摘自http:// ...

  8. HDU 1397 Goldbach's Conjecture【素数打表】

    题意:给出n,问满足a+b=n且a,b都为素数的有多少对 将素数打表,再枚举 #include<iostream> #include<cstdio> #include<c ...

  9. PhoneGap 安装体验

    npm -v #显示版本,检查npm 是否正确安装. npm install express #安装express模块 npm install -g express #加上 -g 启用global安装 ...

  10. andorid 文字颜色selector的使用

    文字颜色selector的使用 创建名称为selector_1的Android项目,在res/color文件夹下创建名称为button_selector_text.xml的文字颜色配置文件,代码如下 ...