1.什么是关联?
关联指的是类之间的引用关系。如果类A与类B关联,那么被引用的类B将被定义为类A的属性。
关联的分类:关联可以分为一对一、一对多/多对一、多对多关联
关联是有方向的
关联的关键点都在外键上
2.如何建立一对多的双向关联关系?
我们以订单和订单项来做demo,
一个订单对多个订单项,多个订单项对一个订单
(订单的实体类里面加入一个属性 Set<OrderItem> orderItems )
(订单项类中加入属性 Order order)
定义一对多的关系时需要采用接口方式
1.建立订单对订单项的一对多的关系(映射文件中)
<set name="orderItems" cascade="save-update" inverse="true">
<!-- key 里面填外键 -->
<key column="oid"></key>
<one-to-many class="com.zking.four.entity.OrderItem"/>
</set>
2.建立订单项对订单多对一的关系
【注意:在Hibernate当中定义实体对象的集合属性时,只能使用接口而不能使用类】
<!-- 原有oid加入 insert="false" update="false" -->(把insert ,update交由order控制)
<property name="oid" type="java.lang.Integer" column="oid" insert="false" update="false"></property>
<many-to-one name="order" class="com.zking.four.entity.Order" column="oid" ></many-to-one>
3.级联新增
Demo模拟新增了一个具有六个订单项的订单
public void testAddOrder() {
Order order = new Order();
order.setOrderNo("order1");
OrderItem orderItem;
for (int i = 0; i < 6; i++) {
orderItem = new OrderItem();
orderItem.setProductId(i);
orderItem.setQuantity(i);
order.getOrderItems().add(orderItem);
orderItem.setOrder(order);
}
this.orderDao.addOrder(order);
}
4.级联查询
//获取订单的同时获取订单项
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())) {//initOrderItems是定义在Order表的一个属性 用来控制加载模式( 0代表懒加载 1.代表立即加载 )
Hibernate.initialize(o.getOrderItems());
}
transaction.commit();
session.close();
return o;
}
5.一对多关联的普通删除
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();
}