映画館の開催をシミュレートする Java アプリケーションを実装しています。エンティティの 1 つは ですFilm
。このエンティティは多数持つことができますがGenres
、明らかに限られた数の しか存在しませんGenres
。これを Hibernate でどのように実装すればよいかわかりません。
最初に enum クラスを作成し、エンティティに属性Genre
を与えました。Film
Set<Genre> genres = new HashSet<>();
これの問題は、が Hibernate によって作成されたテーブルに としてデータベースにGenre
保存され、特定の のすべてのフィルムを要求できないことです。(少なくとも、Hibernate の私の限られた経験では)。BLOB
film_genres
Genre
Genres
次に、起動時にデータベースに可能な限りすべてのGenre
クラスを入力できると考えました。クラスは次のようになります。
public class Genre {
private Integer id;
private String name;
private Genre() {}
public Genre(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
private void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
private void setName(String name) {
this.name= name;
}
}
非常に基本的なクラス。Genre
しかし、今、 aを aに追加したいと言いますFilm
が、できません:
Film film = new Film("The Terminal");
film.addGenre(new Genre("Drama"));
Genre
これを見ると、ジャンルドラマの各映画に新しいオブジェクトが作成されます。次に、最初にデータベースにアクセスしてGenre
「ドラマ」という価値のあるオブジェクトを取得し、そのオブジェクトを追加する必要がありますか?
それが必要な場合は、次のような列挙型を使用したいと思います。
public enum GenreEnum {
DRAMA("Drama"),
ADVENTURE("Adventure"),
ACTION("Action"),
...
private String value;
GenreEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
この理由は、データベースに入力される初期値のスペル (事前入力) と列挙型の値を完全に制御できるため、次のようにすることができます。
Film film = new Film("The Terminal");
film.addGenre(GenreEnum.DRAMA);
そして、addGenre
私ができる方法で:
public void addGenre(GenreEnum ge) {
Query query = session.createQuery("from Genre g where g.name = " + ge.getValue());
Genre genre = (Genre)query.list().get(0);
this.genres.add(genre);
}
トランザクション コードをモデルに入れるつもりはありませんが、簡単にするために入れただけです。また、連結の使用が安全でないことも認識しています。
これはまともな解決策ですか、それともこれを達成するためのより簡単なものが欠けていますか?