1. 程式人生 > >Hibernate學習④:關聯關係

Hibernate學習④:關聯關係

一、關聯【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>

說明: 在這裡插入圖片描述