2017-03-09 20 views
1

私はムービーエンティティとジャンルエンティティを持っています。その名前で与えられたジャンルエンティティでムービーを挿入するにはどうすればよいですか?Hibernate OneToMany with join table

例えば、ジャンルテーブル

+----+--------+ 
| id | name | 
+----+--------+ 
| 1 | Action | 
| 2 | Drama | 
+----+--------+ 

作品のテーブル

+----+----------+ 
| id | name | 
+----+----------+ 
| 1 | Movie 1 | 
| 2 | Movie 2 | 
+----+----------+ 

テーブル

+----+----------+-----------+ 
| id | movie_id | genre_id | 
+----+----------+-----------+ 
| 1 |  1 |   1 | 
| 2 |  1 |   1 | 
| 3 |  1 |   2 | 
+----+----------+-----------+ 

ジャンルエンティティ

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Table; 

import org.hibernate.annotations.GenericGenerator; 

@Entity 
@Table(name = "GENRE") 
public class GenreEntity { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(generator="increment2") 
    @GenericGenerator(name="increment2", strategy = "increment") 
    private int id; 

    @Column(unique = true,name="name") 
    private String name; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public GenreEntity(){ 

    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 
に参加

作品実体

import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.JoinTable; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

import org.hibernate.annotations.GenericGenerator; 

@Entity 
@Table(name = "MOVIE") 
public class MovieEntity { 
    @Id 
    @Column(name = "id") 
    @GeneratedValue(generator="increment") 
    @GenericGenerator(name="increment", strategy = "increment") 
    private int id; 

    @Column(name = "RELEASE_DATE") 
    private Date releaseDate; 

    @Column(name = "name") 
    private String name; 

    @Column(name = "rating") 
    private double rating; 

    @Column(name = "length") 
    private int length; 

    @Column(name = "casting") 
    private String casting; 

    @Column(name = "director") 
    private String director; 

    @Column(name = "description") 
    private String description; 

    @Column(name = "writer") 
    private String writer; 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinTable(
       name = "CATEGORY", 
       joinColumns = @JoinColumn(name = "movie_id") 
      ) 
    private List<GenreEntity> genre = new ArrayList<>(); 

    public List<GenreEntity> getGenre() { 
     return genre; 
    } 

    public MovieEntity(){ 

    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public Date getReleaseDate() { 
     return releaseDate; 
    } 

    public void setReleaseDate(Date releaseDate) { 
     this.releaseDate = releaseDate; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public double getRating() { 
     return rating; 
    } 

    public void setRating(double rating) { 
     this.rating = rating; 
    } 

    public int getLength() { 
     return length; 
    } 

    public void setLength(int length) { 
     this.length = length; 
    } 

    public String getCasting() { 
     return casting; 
    } 

    public void setCasting(String casting) { 
     this.casting = casting; 
    } 

    public String getDirector() { 
     return director; 
    } 

    public void setDirector(String director) { 
     this.director = director; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getWriter() { 
     return writer; 
    } 

    public void setWriter(String writer) { 
     this.writer = writer; 
    } 

} 

コントローラ

import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.hibernate.HibernateException; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.hibernate.cfg.Configuration; 

import eu.ubis.fiimdb.db.entity.GenreEntity; 
import eu.ubis.fiimdb.db.entity.MovieEntity; 

@WebServlet("/addmovie") 
public class AddMovie extends HttpServlet { 
    private String message; 

    public void init() throws ServletException 
     { 
      // Do required initialization 
      message = "Hello World"; 
     } 

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 
     // Set response content type 
     response.setContentType("text/html"); 

     SessionFactory factory = new Configuration() 
       .configure("/META-INF/hibernate.cfg.xml") 
       .buildSessionFactory(); 
     Session session=factory.getCurrentSession(); 

     Transaction transaction = null; 
     try { 
      transaction = session.beginTransaction(); 
      MovieEntity a = new MovieEntity(); 
      GenreEntity b = new GenreEntity(); 
      GenreEntity c = new GenreEntity(); 
      b.setName("Alex"); 
      a.setName("teeefasd"); 
      c.setName("HGFHFG"); 
      a.getGenre().add(b); 
      a.getGenre().add(c); 

      session.persist(a); 
      transaction.commit(); 
     } catch (HibernateException e) { 
      transaction.rollback(); 
      e.printStackTrace(); 
     } finally { 
      session.close(); 
     } 

    } 
} 

私は映画を追加すると、私は、HTMLのselectタグを持っており、ジャンルに挿入していない参加表にジャンルを追加して休止状態にしたいですテーブルおよび結合テーブル

どのようにそれらのジャンルを識別するために休止状態はそれらを再び挿入しないのですか?

最後に、ページに移動してムービー名を入力し、そのムービーに適用する複数のジャンルを選択して送信します。

答えて

1

まず、関連付けはManyToManyです。明らかに、同じジャンルのいくつかの映画があります。

第2に、セレクトボックスがそのオプションの値としてジャンルの名前を使用する理由はまったくありません。代わりにIDを使用し、その名前をオプションのラベルとして使用する必要があります。

したがって、選択されたジャンルのID、選択されたジャンルの動画の作成方法については、アンサーは簡単です。IDを使用してデータベースからジャンルを取得します(Session.get()またはSession.load()、またはEntityManager.find()またはEntityManager.getReference()を使用)。その後、作成したムービーのジャンルリストにこれらのジャンルインスタンスを保存します。