笔记01-Hibernate关联关系
目录
- 1-N关联
- 单向N-1关联
- 单向1-N关联
- 双向1-N关联
- 1-1关联
- N-N关联
- 级联关系
1. 1-N关联
-
1、单向N-1关联
- 从N的一段可以访问1的一端
- 例如:多个订单信息对应一个客户,只需从订单信息中就可以找到关联的客户信息
/** * 单向N-1:测试添加客户和订单信息 * 多个订单对应一个客户 */ @Test public void testAddCustomerOrder() throws Exception { Customer customer = new Customer("李步官", "123456", "韶关"); CustomerDao.addCustomer(customer); Order order1 = new Order(1, new Date(), customer); Order order2 = new Order(2, new Date(), customer); //添加订单信息 OrderDao.addOrder(order1); OrderDao.addOrder(order2); HibernateUtil.closeSession(); }
-
2、单向1-N关联
- 相对于单向N-1关联,单向1-N关联关系中的1端对应多个对象
- 例如:一个客户有多个订单
- 单向N-1关联的N端采用Set集合的形式,使用set元素来映射1-N关联
<!-- 1-N关联关系 --> <set name="orders"> <key column="customerId"/> <one-to-many class="com.chapter06.pojo.Order"/> </set>
/** * 单向1-N:测试获取用户 * 一个客户有多个订单信息 */ @Test public void testGetCustomer(){ Customer customer = CustomerDao.getCustomer(2); Set<Order> orders = customer.getOrders(); System.out.println("客户:"+ customer.getUsername() +"的订单如下:"); for (Order order : orders) { System.out.println("\nid:" + order.getId() + "\norderNo:" + order.getOrderNo() + "\norderDate:" + order.getDate() + "\ncustomerId:" + order.getCustomer().getUsername() ); } }
-
3、双向1-N关联
- 将单向的N-1关联和1-N关联整合在一起就是双向1-N关联
- 表示可以从1端访问N端,也可以从N端访问1端
- 例如:可以从订单中查询客户,也可以从客户中查询订单
2. 1-1关联
-
1、基于外键的单向1-1关联
可以理解为N端为1的单向N-1关系- pojo类的代码类似于单向的N-1,因为N的一端或1的一端都是直接访问关联实体
- 对于映射配置,基于外键的单向1-1需要在元素中配置unique属性为true
- 通过在N端添加唯一约束的方法,将单向N-1变成等同于基于外键的单向1-1关联关系
-
2、基于主键的单向1-1关联
持久化类不能拥有自己的主键生成器策略,其主键由关联实体负责生成- 基于主键关联的持久化类不能有自己的主键生成器策略,其主键由关联实例来负责生成
- 使用元素来映射关联实体
-
3、基于外键的双向1-1关联
存放外键的一端增加元素,而另一端需要使用元素。- 外键可以存放在任意一边
- 外键的一端需要增加元素,并将该元素的unique属性值设置为true
- 另一端则使用元素
-
4、基于主键的双向1-1关联
两个关联表使用相同的主键值- 与基于主键的单向1-1关联类似
- 在没有标记的乙方增加标记,从而建立了双向的一对一关联
3. N-N关联
在实际开发过程中,数据表之间的N-N关联使用不多,通常是拆分成两个1-N关联来实现。同样也可以采用两个1-N来代替N-N关联。
4. 级联关系
级联是指对一个对象进行修改、删除、更新等操作时,被关联的对象也需进行相应的操作。
<!-- 1-N关联关系 -->
<set name="orders" cascade="save-update">
<key column="customerId"/>
<one-to-many class="com.chapter06.pojo.Order"/>
</set>
/**
* 测试级联操作
*/
@Test
public void testAddCustomerWithCascade() throws Exception {
Session session = HibernateUtil.getSession();
Customer customer = new Customer("李四", "123456", "广州");
Order order1 = new Order(3, new Date(), customer);
System.out.println("order = " + order1);
customer.getOrders().add(order1);
System.out.println("级联保存客户和订单:");
System.out.println("id = " + customer.getId() +
"\nname = " + customer.getUsername() +
"\npass = " + customer.getPassword() +
"\naddress = " + customer.getAddress()
);
session.save(customer);
HibernateUtil.closeSession();
}