1.many端和多对一关系时一致
package com.hibernate.entities.n21both;
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;
}
}
2.one端需要增加一个集合
package com.hibernate.entities.n21both;
import java.util.HashSet;
import java.util.Set;
public class Customer {
private Integer customerId;
private String customerName;
/*
* 需要把集合初始化,防止发生空指针异常
* 声明集合类型时,需使用接口类型,因为hibernate在获取集合类型时,返回的是Hibernate内置的集
* 合类型,而不是javaSE一个标准的集合实现
*/
private Set<Order> orders = new HashSet<>();
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;
}
public Set<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
}
3.one端.bhm.xml文件需要添加映射一对多集合属性
推荐在one端的set节点指定 inverse=true,使one端放弃维护
<?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 2018-7-25 10:20:33 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping package="com.hibernate.entities.n21both">
<class name="Customer" table="CUSTOMERS">
<id name="customerId" type="java.lang.Integer">
<column name="CUSTOMER_ID" />
<generator class="native" />
</id>
<property name="customerName" type="java.lang.String">
<column name="CUSTOMER_NAME" />
</property>
<!--
映射一对多的集合属性
set:映射set类型的属性
table:set中的元素对应的记录放在哪个数据表中,该值需要和many端表名一致
key:many端表中外键列名字
-->
<set name="orders" table="ORDERS" inverse="true">
<key column="CUSTOMER_ID"></key>
<one-to-many class="Order"/>
</set>
</class>
</hibernate-mapping>
4.many端.bhm.xml文件不变
5.双向一对多映射方法
(1)save方法
①执行SAVE操作:先插入Customer,再插入Order。3条INSERT,2条UPDATE
②因为one端和many端都维护关联关系,所以会有update语句
③推荐在one端的set节点指定 inverse=true,使one端放弃维护
④建议先插入one端
@Test
public void testMany21Save() {
Customer customer = new Customer();
customer.setCustomerName("AA");
Order order1 = new Order();
order1.setOrderName("ORDER_1");
Order order2 = new Order();
order2.setOrderName("ORDER_2");
//设定关联关系
order1.setCustomer(customer);
order2.setCustomer(customer);
customer.getOrders().add(order1);
customer.getOrders().add(order2);
//执行SAVE操作:先插入Customer,再插入Order。3条INSERT,2条UPDATE
//因为one端和many端都维护关联关系,所以会有update语句
//推荐在one端的set节点指定 inverse=true,使one端放弃维护
//建议先插入one端
session.save(customer);
session.save(order1);
session.save(order2);
}
(2)gei方法
@Test
public void test12ManyGet() {
//1.对many端的集合采用延迟加载
Customer customer = session.get(Customer.class, 1);
System.out.println(customer.getCustomerName());
}