•双向 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实体类对应的hbm映射文件:orders=new HashSet (); 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 getOrders() { return orders; } public void setOrders(Set orders) { this.orders = orders; } }
Order.hbm.xml
Customer.hbm.xml
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()); }