ManyToManyのメモ


テーブル

create table movie (
id identity,
name varchar(50),
primary key (id)
);
create table actor (
id identity,
name varchar(50),
primary key (id)
);
create table movie_actor (
movie_id bigint,
actor_id bigint,
primary key (movie_id, actor_id)
);

Movie.class

package sample;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;

@Entity
public class Movie implements Serializable {

    private static final long serialVersionUID = 1L;
    
    private int id;
    private String name;
    private List actors = new ArrayList();
    
    public Movie() {
    }

    public Movie(String name) {
    	this.name = name;
    }
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String title) {
        this.name = title;
    }
    
    @ManyToMany(
    		targetEntity=sample.Actor.class, 
    		cascade=CascadeType.ALL, 
    		fetch=FetchType.LAZY
    )
    @JoinTable(
    	name="movie_actor",
        joinColumns={@JoinColumn(name="movie_id")},
        inverseJoinColumns={@JoinColumn(name="actor_id")}
    )
    public List getActors() {
        return actors;
    }
    
    public void setActors(List actors) {
        this.actors = actors;
    }
    
    public void addActor(Actor actor) {
        actors.add(actor);
    }
}

Actor.class

package sample;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Actor implements Serializable {

    private static final long serialVersionUID = 1L;
    
    private int id;
    private String name;
    private List movies = new ArrayList();
    
    public Actor() {
    }

    public Actor(String name) {
    	this.name = name;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    @ManyToMany(
    		cascade=CascadeType.ALL, 
    		fetch=FetchType.LAZY,
    		mappedBy="actors")
    public List getMovies() {
        return this.movies;
    }

    public void setMovies(List movies) {
        this.movies = movies;
    }

    public void addMovies(Movie movie) {
        this.movies.add(movie);
    }

}

persistence.xml



	
		org.hibernate.ejb.HibernatePersistence
		sample.Actor
		sample.Movie
		
			
			
			
			
			
			
			
			
		
	



Main.class

package sample;

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

public class ManyToManyExample {
	
	public static void main(String[] args) {
		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");
	    
	    em.persist(brad);
	    em.persist(orlando);

	    Movie troy = new Movie("Troy");
	    Movie babel = new Movie("Babel");
	    Movie pirates = new Movie("Pirates of Caribbean:The Curse of the Black Pearl");
	    
	    em.persist(troy);
	    em.persist(babel);
	    em.persist(pirates);
	    
	    troy.addActor(brad);
	    troy.addActor(orlando);
	    babel.addActor(brad);
	    pirates.addActor(orlando);
	    
	    em.merge(troy);
	    em.merge(babel);
	    em.merge(pirates);
	    
// ↓ 	関連テーブルの登録が行なわれない。
//	    以下のコードで登録をする場合、ActorのmappedByを削除し、
//	    代わりに@JoinTableを定義してやる必要がある。
//	    
//	    brad.addMovies(troy);
//	    brad.addMovies(babel);
//	    orlando.addMovies(troy);
//	    orlando.addMovies(pirates);
//	    
//	    
//	    em.merge(brad);
//	    em.merge(orlando);
	    
		tx.commit();
		
		em.close();
		emf.close();
	}

}