一、关联【association】
1、含义:指的是类之间的引用关系,如果类A与类B关联,那么被引用的类B将被定义为类A的属性
2、分类:
①一对一
②一对多
③多对一
④多对多
说明:关联是有方向的
二、级联新增
1、外键处理的三种方法:
(1)删除从表对应的实体类中的外键属性
(2)在配置的xml中外键属性上添加
(3)在配置的xml中的many-to-one标签中添加
2、Casecade【用来控制如何操作关联的持久化对象的】
①None : 保存,更新或删除当前对象时,忽略其他关联的对象
②Save-update : 保存,更新时级联保存所有的临时对象,并且级联更新关联的游离对象
③Delete : 通过session的delete方法删除当前对象,级联删除关联的对象
④All : 等于save-update操作+delete操作
测试①
@Test
//增加订单项
public void testAddOrderItem() {
OrderItem orderItem = new OrderItem();
// orderItem.setOid(7);
orderItem.setPirductId(34);
orderItem.setQuantity(78);
Order order = new Order();
//要保证主表中有该数据
order.setOrderId(6);
orderItem.setOrder(order);
this.orderDao.addOrderItem(orderItem);
}
测试②
//增加订单
public void testAddOrder() {
Order order = new Order();
order.setOrderNo("p8");
OrderItem orderItem;
for (int i = 1; i < 7; i++) {
orderItem = new OrderItem();
orderItem.setPirductId(i);
orderItem.setQuantity(i);
//双向绑定
order.getOrderItems().add(orderItem);
orderItem.setOrder(order);
}
this.orderDao.addOrder(order);
}
三、级联查询
//设置是否懒加载
if(o != null && new Integer(1).equals(order.getInitOrderItems())) {
Hibernate.initialize(o.getOrderItems());
}
dao①
//查询单个订单
public Order getOrder(Order order) {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
Order o = session.get(Order.class, order.getOrderId());
//设置是否懒加载
if(o != null && new Integer(1).equals(order.getInitOrderItems())) {
Hibernate.initialize(o.getOrderItems());
}
transaction.commit();
session.close();
return o;
}
dao②
//查询所有订单
public List<Order> getOrderList(){
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
List list = session.createQuery("from Order").list();
transaction.commit();
session.close();
return list;
}
四、普通删除
先删除从表,再删除主表
Dao
//删除订单以及对应订单项
public void delOrder(Order order) {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
//查询对应的订单项
Order o = session.get(Order.class, order.getOrderId());
//遍历展示
for (OrderItem ot : o.getOrderItems()) {
//删除对应订单项【先删除从表】
session.delete(ot);
}
//再进行订单删除【再删除主表】
session.delete(o);
transaction.commit();
session.close();
}
五、补充
1、insert属性设置中主控方概念理解
①Lazy : true (默认) ——>延迟加载
False ——>立即加载(影响查询性能)
②outter-join : true ——>使用左联接查询关联(性能不高)
False(默认)
③inverse :true ——> 将对方设置为主控方(一对多,可以减少sql语句数量,减少多余操作)
False (默认)
2、【一对多双向关联】关系建立 ----订单与订单项
order.hbm.xml
<!--
cascade:用来配置维护实体类的关系所用
inverse:关系交由反方控制
-->
<set name = "orderItems" cascade = "save-update" inverse = "true">
<!-- 填外键 -->
<key column = "oid"></key>
<one-to-many class = "com.zking.four.entity.OrderItem"></one-to-many>
</set>
3、【多对一双向关联】关系建立
<many-to-one name = "order" class = "com.zking.four.entity.Order" column = "oid"></many-to-one>
说明: