jpaカスケード操作詳細解4-カスケード更新(CascadeType.MERGE)


jpaでのアプリケーション中級聯の更新は他のものよりあまり使われていませんが、よく知る必要があります。
この話の例では、私達は依然として車庫と自動車を実体類としています。
Garage.java
package com.hibernate.jpa.bean1;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Garage {

	/**
	 * many to one jpa     hibernate  
	 */
	private Integer gid;
	private String garagenum;
	private Set<Auto> autos = new HashSet<Auto>();
	
	@Id @GeneratedValue
	public Integer getGid() {
		return gid;
	}
	public void setGid(Integer gid) {
		this.gid = gid;
	}
	@Column(length=20)
	public String getGaragenum() {
		return garagenum;
	}
	public void setGaragenum(String garagenum) {
		this.garagenum = garagenum;
	}
	@OneToMany(cascade={CascadeType.PERSIST},mappedBy="garage")
	public Set<Auto> getAutos() {
		return autos;
	}
        // CascadeType.PERSIST:     
	public void setAutos(Set<Auto> autos) {
		this.autos = autos;
	}
	public void addGarageAuto(Auto auto) {
		auto.setGarage(this);
		this.autos.add(auto);
	}

}
Auto.java
package com.hibernate.jpa.bean1;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Auto {

	/**
	 * one to many jpa       hibernate  
	 */
	private Integer autoId;
	private String autotype;
	private String autonum;
	private Garage garage;

	@Id @GeneratedValue
	public Integer getAutoId() {
		return autoId;
	}
	public void setAutoId(Integer autoId) {
		this.autoId = autoId;
	}
	public String getAutotype() {
		return autotype;
	}
	public void setAutotype(String autotype) {
		this.autotype = autotype;
	}
	public String getAutonum() {
		return autonum;
	}
	public void setAutonum(String autonum) {
		this.autonum = autonum;
	}
	@ManyToOne(cascade={CascadeType.REMOVE,CascadeType.REFRESH})
	@JoinColumn(name="garageid")
	public Garage getGarage() {
		return garage;
	}
        // CascadeType.REMOVE:     ;  CascadeType.REFRESH:     
	public void setGarage(Garage garage) {
		this.garage = garage;
	}

}
ユニット試験方法
	@Test public void update() {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-hibernate");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Garage garage = em.find(Garage.class, 1);
		garage.setGaragenum("RoomAA");
		
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
運転観察
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注釈を追加する          //// CascadeType.MERGE連結
	@OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},mappedBy="garage")
	public Set<Auto> getAutos() {
		return autos;
	}
セル試験方法の
garage.setGaragenum("RoomAA");
直してください
garage.setGaragenum("RoomBB");
運行udate()
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=?
これは前回送ったsql文と同じです。