我在 Hibernate 中使用 JPA 注释,但我真的不知道如何管理关联表。
实体关系
这是我的数据库模式作为实体关系(ER)图:
COUNTRY COUNTRY_MOVIE
|---------|* *|---------------| | MOVIE |
| COU_ID |<---->| COUNTRY_ID |* *|---------|
| LABEL | | MOVIE_ID |<---->| MO_ID |
|---------| |---------------| | LABEL |
|---------|
该表COUNTRY_MOVIE
是多对多关联之间和具有多对多关联的关联表(由上面的箭头线表示,其中多对多由 表示)。COUNTRY
MOVIE
* *
使用 JPA 在代码中建模的实体
在我的 JPA 对象中,我没有创建一个CountryMovie.java
类。
国家
但我@JoinTable
在Country.java
下面的代码中使用:
//Package, Import...
@Entity
@Table(name="COUNTRY")
public class Country implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="COU_ID")
private Integer couID;
@Column(name="LABEL")
private String label;
//bi-directional many-to-many association to TFilmFil
@ManyToMany
@JoinTable(
name="COUNTRY_MOVIE"
, joinColumns={
@JoinColumn(name="COU_ID")
}
, inverseJoinColumns={
@JoinColumn(name="MO_ID")
}
)
private List<Movie> movies;
public Country() {
super();
}
// Other constructor, Getter & Setter, and "toString" method...
}
电影
在Movie.java
我只使用一个@ManyToMany
注释:
//Package, Import...
@Entity
@Table(name="MOVIE")
public class Movie implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="MO_ID")
private Integer moId;
@Column(name="LABEL")
private String label;
//bi-directional many-to-many association to TrPaysPay
@ManyToMany(mappedBy="movies")
private List<Country> countries;
public Film() {
super();
}
// Other constructor, Getter & Setter, and "toString" method...
}
问题一:LazyInitializationException
我不知道这是否是管理这种关联表的最佳方式,即使它看起来不错。
但是当我尝试获取一部电影的所有国家/地区时,我LazyInitializationException
从 Hibernate 获得了一个。
问题2:我试过之后FetchType.EAGER
所以我尝试为每个多对多注释添加一个 fetch EAGER:
在Country
:
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(
在Movie
:
@ManyToMany(mappedBy="movies",fetch=FetchType.EAGER)
然后我得到这个:
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
问题
- 我是否必须创建另一个 java 类来映射
COUNTRY_MOVIE
? - 或者有没有办法通过使用与现在相同的java类来解决这个问题?