jpa級聯操作詳解5-級聯更新2(CascadeType.MERGE)

在上一講中我們看到兩次發出的sql語句是一樣的,也就是說兩種情況對數據庫的操作是一樣的,爲什麼會這樣呢?

主要是由於,級聯更新在實體是遊離狀態下才起作用現在依然使用上一講的實體bean;

第一次在Garage.java 不添加CascadeType.MERGE註解

	@OneToMany(cascade={CascadeType.PERSIST},mappedBy="garage")
	public Set<Auto> getAutos() {
		return autos;
	}

重新編寫單元測試方法

	@Test public void update() {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-hibernate");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Garage garage = em.find(Garage.class, 1);
		em.clear(); //改爲遊離狀態
		garage.setGaragenum("RoomTOP");
		
		em.merge(garage);
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

 運行之後

觀察發出的sql語句

Hibernate: select garage0_.gid as gid1_0_, garage0_.garagenum as garagenum1_0_ from Garage garage0_ where garage0_.gid=?
Hibernate: select garage0_.gid as gid1_0_, garage0_.garagenum as garagenum1_0_ from Garage garage0_ where garage0_.gid=?
Hibernate: update Garage set garagenum=? where gid=?

 (二)添加CascadeType.MERGE註解

 

	@OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},mappedBy="garage")
	public Set<Auto> getAutos() {
		return autos;
	}

 運行單元測試方法update()

觀察發出的sql語句

Hibernate: select garage0_.gid as gid1_0_, garage0_.garagenum as garagenum1_0_ from Garage garage0_ where garage0_.gid=?
Hibernate: select garage0_.gid as gid1_1_, garage0_.garagenum as garagenum1_1_, autos1_.garageid as garageid3_, autos1_.autoId as autoId3_, autos1_.autoId as autoId0_0_, autos1_.autonum as autonum0_0_, autos1_.autotype as autotype0_0_, autos1_.garageid as garageid0_0_ from Garage garage0_ left outer join Auto autos1_ on garage0_.gid=autos1_.garageid where garage0_.gid=?
Hibernate: update Garage set garagenum=? where gid=?

 比較第一次和第二次發出的sql語句,第二次是做外連接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章