更新のメモ


明示的に更新メソッド(EntityManager.merge())を呼び出さない更新と、更新メソッド(EntityManager.merge())を呼び出す更新の動作確認。

EntytyManager.merge() を使用しない更新(関連テーブル) ← いや削除・・・

package sample;

import java.util.ArrayList;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class UpdateExample1 {
	
	public static void main(String[] args) {
	    int id = -1;
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("hibernate");
		{
			EntityManager em = emf.createEntityManager();
			
		    final EntityTransaction tx = em.getTransaction();
		    tx.begin();

		    Actor brad = new Actor("Brad Pitt");
		    Actor orlando = new Actor("Orlando Bloom");
		    
		    Movie troy = new Movie("Troy");
		    
		    troy.addActor(brad);
		    troy.addActor(orlando);

		    em.persist(troy);
		    
		    id = troy.getId();
		    
			tx.commit();
			em.close();
		}
		{
			EntityManager em = emf.createEntityManager();
			
		    final EntityTransaction tx = em.getTransaction();
		    tx.begin();

		    Movie troy = em.find(Movie.class, id);

		    // 関連を削除
		    troy.setActors(new ArrayList());
		    
			tx.commit();
			em.close();
		}
		emf.close();
	}

}
実行結果

select * from ACTOR ;

ID NAME
102 Eric Bana

select * from MOVIE;

ID NAME
91 Troy

select * from MOVIE_ACTOR;

MOVIE_ID ACTOR_ID
91 102

EntytyManager.merge() を使用しない更新(Actorテーブル)

package sample;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class UpdateExample2 {
	
	public static void main(String[] args) {
	    int id = -1;
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("hibernate");
		{
			EntityManager em = emf.createEntityManager();
			
		    final EntityTransaction tx = em.getTransaction();
		    tx.begin();

		    Actor brad = new Actor("Brad Pitt");
		    
		    Movie troy = new Movie("Troy");
		    
		    troy.addActor(brad);

		    em.persist(troy);
		    
		    id = troy.getId();
		    
			tx.commit();
			em.close();
		}
		{
			EntityManager em = emf.createEntityManager();
			
		    final EntityTransaction tx = em.getTransaction();
		    tx.begin();

		    Movie troy = em.find(Movie.class, id);

		    List actors = troy.getActors();
		    
		    Actor actor = actors.get(0);
		    
		    actor.setName("Eric Bana");
		    
			tx.commit();
			em.close();
		}
		emf.close();
	}

}
実行結果

select * from ACTOR ;

ID NAME
102 Eric Bana

select * from MOVIE;

ID NAME
91 Troy

select * from MOVIE_ACTOR;

MOVIE_ID ACTOR_ID
91 102


EntytyManager.merge() を使用した更新

package sample;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class MergeExample {
	
	public static void main(String[] args) {
	    int id = -1;
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("hibernate");
		{
			EntityManager em = emf.createEntityManager();
			
		    final EntityTransaction tx = em.getTransaction();
		    tx.begin();

		    Actor brad = new Actor("Brad Pitt");
		    
		    Movie troy = new Movie("Troy");
		    
		    troy.addActor(brad);

		    em.persist(troy);
		    
		    id = troy.getId();
		    
			tx.commit();
			em.close();
		}
		{
			EntityManager em = emf.createEntityManager();
			
		    final EntityTransaction tx = em.getTransaction();
		    tx.begin();

		    Movie mexican = new Movie();
		    mexican.setId(id);
		    mexican.setName("The Mexican");

		    em.merge(mexican);
		    
			tx.commit();
			em.close();
		}
		emf.close();
	}

}
実行結果

select * from ACTOR ;

ID NAME
101 Brad Pitt

select * from MOVIE;

ID NAME
90 The Mexican

select * from MOVIE_ACTOR;

MOVIE_ID ACTOR_ID