0

我正在实现一个模拟电影院举行的 Java 应用程序。其中一个实体是 a Film,这个实体可以有很多Genres,但显然只有有限的数量Genres。我不确定我应该如何在 Hibernate 中实现它。

首先,我创建了一个枚举类Genre并给Film实体一个Set<Genre> genres = new HashSet<>();属性。

这样做的问题是,它Genre作为 a 存储BLOB在数据库中,在 Hibernate 创建的名为的表中film_genres,我将无法要求特定的所有电影Genre。(至少在我有限的 Hibernate 经验中)。

然后我想我可以在启动时填充数据库,GenresGenre看起来像这样:

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

很基础的一门课。但是现在说我想将 a 添加Genre到 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 回答