我正在实现模拟电影院控制的Java应用程序。其中一个实体是Film
,该实体可以有许多Genres
,但显然只有有限数量的Genres
。我不知道我应该如何在Hibernate中实现这一点。一对多选择有限选项的多对多映射
首先我做了一个enum类Genre
,并给Film
实体一个Set<Genre> genres = new HashSet<>();
属性。
这样做的问题是,Genre
被存储在数据库中的BLOB
,在由Hibernate创建的表称为film_genres
,我将无法向特定Genre
的所有电影。 (至少在我有限的Hibernate经验)。
然后,我以为我可以填充在启动数据库与所有可能的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
添加到Film
,我不能这样做:
Film film = new Film("The Terminal");
film.addGenre(new Genre("Drama"));
看到,因为这会因为这是流派剧每部电影创建一个新的Genre
对象。然后,我需要首先访问数据库以获取值为“Drama”的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);
}
我不会把事务代码放在模型中,但我只是为了简化而放在那里。我也意识到使用串联是不安全的。
这是一个体面的解决方案还是我错过了更简单的实现这一点?