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 Listactors = 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 Listmovies = 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(); } }