hibernate 双向1对多
1:
还是用客户Customer和订单Order来解释:
“一对多”的物理意义:一个客户可以有多个订单,某个订单只能归宿于一个客户。
“双向”的物理意义:客户知道自己有哪些订单,订单也知道自己归宿于哪个客户。也就是说,通过客户对象可以检索到其拥有哪些订单;同时,通过订单也可以查找到其对应的客户信息。这是符合我们业务逻辑需求。
1的1方
<set name="orders" table="ORDERS">
<key column="customer_Id"></key>
<one-to-many class="Order"/>
</set>
多的1方
<many-to-one name="customer" class="Customer" column="customer_Id"></many-to-one>
例子:
1的一方:
package com.hibernate.n21.both; import java.util.HashSet;
import java.util.Set; public class Customer {
private Integer customerId;
private String customerName;
//双向1对多 在1的1方加一个set集合
//需要把集合进行初始化。可防止空指针异常。
private Set<Order> orders =new HashSet<Order>(); public Set<Order> getOrders() {
return orders;
} public void setOrders(Set<Order> orders) {
this.orders = orders;
}
public Integer getCustomerId() {
return customerId;
} public void setCustomerId(Integer customerId) {
this.customerId = customerId;
} public String getCustomerName() {
return customerName;
} public void setCustomerName(String customerName) {
this.customerName = customerName;
} }
1的一方的配置文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hibernate.n21.both"> <class name="Customer" table="customer"> <id name="customerId" type="java.lang.Integer">
<column name="customer_Id" />
<!-- 指定主键的生成方式, native: 使用数据库本地方式 -->
<generator class="native" />
</id> <property name="customerName"
type="java.lang.String" column="customer_Name" >
</property> <set name="orders" table="ORDERS">
<key column="customer_Id"></key>
<one-to-many class="Order"/>
</set> </class> </hibernate-mapping>
多的一方:
package com.hibernate.n21.both; public class Order {
private Integer orderId;
private String orderName;
private Customer customer;
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer 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;
} }
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hibernate.n21.both"> <class name="Order" table="orders" > <id name="orderId" type="java.lang.Integer">
<column name="order_Id" />
<!-- 指定主键的生成方式, native: 使用数据库本地方式 -->
<generator class="native" />
</id> <property name="orderName"
type="java.lang.String" column="order_Name" >
</property> <!-- 映射n-1的关联关系 -->
<many-to-one name="customer" class="Customer" column="customer_Id"></many-to-one>
</class> </hibernate-mapping>
测试:
保存save():
@org.junit.Test
public void testN21Save(){
Customer customer=new Customer();
customer.setCustomerName("AA");
Order order1 =new Order();
order1.setOrderName("order-1");
Order order2 =new Order();
order2.setOrderName("order-2");
//会出现3个insert。2个update。 因为 1 的一端和 n 的一端都维护关联关系. 所以会多出 UPDATE
//可以在 1 的一端的 set 节点指定 inverse=true, 来使 1 的一端放弃维护关联关系!
//建议设定 set 的 inverse=true, 建议先插入 1 的一端, 后插入多的一端
inverse 相反的。反转。反转维护的方向。
inverse="true"。就是让1的一方放弃维护关系。因为我们都可以记住习大大。但是习大大不可能全记得我们
//好处是不会多出 UPDATE 语句
//设置关联关系。就是给多的一方设置外键
order1.setCustomer(customer);
order2.setCustomer(customer);
customer.getOrders().add(order1);
customer.getOrders().add(order2); session.save(customer);
session.save(order1);
session.save(order2);
}
查询:
@org.junit.Test
public void testGet(){
Customer customer=(Customer) session.get(Customer.class, 1);
System.out.println(customer.getCustomerName());
}
只显示Customer。没有出现set集合的内容。
@org.junit.Test
public void testGet(){
Customer customer=(Customer) session.get(Customer.class, 1);
System.out.println(customer.getCustomerName());
//2:class org.hibernate.collection.internal.PersistentSet 返回的hibernate内置的集合类型。
//这个类型具有延迟加载和存放代理对象的功能。
System.out.println(customer.getOrders().getClass()); }
@org.junit.Test
public void testGet(){
Customer customer=(Customer) session.get(Customer.class, 1);
System.out.println(customer.getCustomerName());
//class org.hibernate.collection.internal.PersistentSet 返回的hibernate内置的集合类型。
//这个类型具有延迟加载和存放代理对象的功能。
System.out.println(customer.getOrders().getClass());
//3:在查询完customer后就把session关闭。会出现懒加载异常。
session.close();
System.out.println(customer.getOrders().size());
}
4:在需要使用集合中元素的时候进行初始化。
删除:
@org.junit.Test
public void testDelete(){
Customer customer=(Customer) session.get(Customer.class, 1);
session.delete(customer);
}
直接删除的话会报错。
在配置文件中的set集合。设置cascade属性。
这是级联删除。就是只要多的一方的外键是1的主键的。删除1。对应的多的全部删除掉。
<set name="orders" table="ORDERS" inverse="true" cascade="delete">
cascade="delete-orphan":删除孤儿。解除关联关系。把多的外键为1主键的都删除掉。因为解除关系了。变成孤儿了。
save-update 级联保存。就是不用写session.save(order);
order-by属性:里面是数据库中的字段名。不是类的属性名。
hibernate 双向1对多的更多相关文章
- Hibernate双向多对多关联
一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project { //编号 priva ...
- 注解:【无连接表的】Hibernate双向1->N关联
Person与Address关联:双向1->N,[无连接表的],推荐使用 #由N端控制关联关系 #对于指定了mappedBy属性的@OneToMany,@ManyToMany,@OneToOne ...
- Hibernate双向多对多对象关系模型映射
1 双向many-to-many 业务模型: 描述员工和项目 一个员工同时可以参与多个项目 一个项目中可以包含多个员工 分析:数据库的数据模型,通过中间关系表,建立两个one-to-many构成man ...
- hibernate 双向n-n
领域模型: 关系数据模型 双向 n-n 关联须要两端都使用集合属性 双向n-n关联必须使用连接表 集合属性应添加 key 子元素用以映射外键列, 集合元素里还应添加many-to-many子元素关联实 ...
- hibernate 双向 1-n(具体分析)
双向 1-n 与 双向 n-1 是全然同样的两种情形 双向 1-n 须要在 1 的一端能够訪问 n 的一端, 反之依旧. 域模型:从 Order 到 Customer 的多对一双向关联须要在Order ...
- hibernate双向一对多映射
双向多对一 :Customer类------------>一的一端 Order类----------->多的一端 Customer类:(省略set().get()和构造方法) priv ...
- hibernate双向关联
双向关联中最好的设置是一端为inverse=true,一端为inverse=false. falses维护,true不维护,设置多的一方维护(false) inverse属性就是用来规定是由谁来维护这 ...
- 注解:【基于外键的】Hibernate双向1->1关联
Person与Address关联:双向1->1,[基于外键的]. #主表不应该控制关联关系.(否则会导致生成额外的update语句,从而导致性能下降), #因此主表对应的实体中使用@OneToO ...
- 注解:Hibernate双向N->N关联(两端都控制关联关系)
Person与Address关联:双向N->N,[连接表必须有],两端都控制关联关系 #需要说明的是:如果程序希望某一端放弃控制关联关系,则可以在这一段的@ManyToMany注解中指定mapp ...
随机推荐
- 自建云存储:Nextcloud vs. ownCloud vs. Seafile
Self-hosted Cloud Storage: Nextcloud vs. ownCloud vs. Seafile By Ashutosh KS in Hosting. Updated on ...
- SGU 194 Reactor Cooling (无源上下界网络流)
The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuclear ...
- webpack对脚本和样式的处理
一.对js处理 webpack本身支持js加载也可以用插件. 1.加载要全局使用的插件比如jquery 在页面用cdn方式引用,然后再webpack.config.js里配置.会让jquery成为全局 ...
- MySQL-5.7填坑
绿色版(zip archive 版)无 my-default.ini As of MySQL 5.7.18, my-default.ini is no longer included in or in ...
- jmeter添加自定义扩展函数之MD5加密
1,打开eclipse,新建maven工程,在pom中引用jmeter核心jar包,具体请看---https://www.cnblogs.com/guanyf/p/10863033.html---,这 ...
- [MAC]配置Jenkins 开机自启动
如果是将jenkins.war放在tomcat中运行的, 则可以配置开机启动tomcat,脚本如下: XXX表示是你安装Tomcat所在目录 #启动tomcat cd XXX/Tomcat8/bin ...
- Appium移动端自动化:Api接口详解
滑动操作与拖拽操作 # 滚动处理 # elementObj1 目标滚动元素,elementObj2 起始滚动元素 # 底层通过action操作,与web ui相反,origin_el为目标元素,des ...
- 基于全局地址池的DHCP
一.实验目的 二.实验拓扑图 .三.实验编址 四.实验步骤 1.配置IP 2.配置基于全局地址池的DHCP server 使用IP pool命令创建一个新的全局地址池,名称为hjt1 配置hjt1可动 ...
- 【JavaScript性能优化】------理解Script标签的加载和执行
1.script标签是如何加载的?当浏览器遇到一个 < script>标签时,浏览器会停下来,运行JavaScript代码,然后再继续解析.翻译页面.同样的事情发生在使用 src 属性加载 ...
- “希希敬敬对”队软件工程第九次作业-beta冲刺第六次随笔
“希希敬敬对”队软件工程第九次作业-beta冲刺第六次随笔 队名: “希希敬敬对” 龙江腾(队长) 201810775001 杨希 201810812008 何敬 ...