Hibernate學習④:關聯關係
阿新 • • 發佈:2018-12-17
一、關聯【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>
說明: