0

映画館の開催をシミュレートする Java アプリケーションを実装しています。エンティティの 1 つは ですFilm。このエンティティは多数持つことができますがGenres、明らかに限られた数の しか存在しませんGenres。これを Hibernate でどのように実装すればよいかわかりません。

最初に enum クラスを作成し、エンティティに属性Genreを与えました。FilmSet<Genre> genres = new HashSet<>();

これの問題は、が Hibernate によって作成されたテーブルに としてデータベースにGenre保存され、特定の のすべてのフィルムを要求できないことです。(少なくとも、Hibernate の私の限られた経験では)。BLOBfilm_genresGenre

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);
}

トランザクション コードをモデルに入れるつもりはありませんが、簡単にするために入れただけです。また、連結の使用が安全でないことも認識しています。

これはまともな解決策ですか、それともこれを達成するためのより簡単なものが欠けていますか?

4

1 に答える 1

0

ジャンル全体を主キーにするか

public enum Genre {
    DRAMA("Drama"),
    ADVENTURE("Adventure"),
    ACTION("Action"),
    ...

    private String value;

    GenreEnum(String value) {
        this.value = value;
    }

    public int getId() {
        return id;
    }

    public String getValue() {
        return value;
    }
}

<compositeId>
  <key-property name="value" />
</compositeId>


Film film = new Film("The Terminal");
film.addGenre(session.load<GenreEnum>(Genre.DRAMA));

// or
for(Genre g : GetAllGenre)
    session.attach(g);

Film film = new Film("The Terminal");
film.addGenre(Genre.DRAMA);

または、列挙型に固定 ID を導入します

public enum Genre {
    DRAMA(1, "Drama"),
    ADVENTURE(2, "Adventure"),
    ACTION(3, "Action"),
    ...

    private int id;
    private String value;

    GenreEnum(int id, String value) {
        this.id = id;
        this.value = value;
    }

    public int getId() {
        return id;
    }

    public String getValue() {
        return value;
    }
}

Film film = new Film("The Terminal");
film.addGenre(session.load<GenreEnum>(Genre.DRAMA.getId()));
于 2012-10-30T14:55:47.017 に答える