我正在使用带有Hibernate的JPA注释,我真的不知道如何管理关联表。
这是我的数据库:
| COUNTRY | | COUNTRY_MOVIE| | MOVIE |
|---------| |--------------| |---------|
| COU_ID |* *| COUNTRY_ID |* *| MO_ID |
| LABEL |<---->| MOVIE_ID |<---->| LABEL |
|---------| |--------------| |---------|
表COUNTRY_MOVIE
是COUNTRY
和MOVIE
之间的关联表,具有多对多关联
在我的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...
}
我不知道这是否是管理这种关联表的最佳方式,但它看起来不错,但是当我尝试获取电影的所有国家/地区时,我从Hibernate获得LazyInitializationException
。
所以我尝试在每个多对多注释中添加一个获取EAGER:
在国家:
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(
在电影中:
@ManyToMany(mappedBy="movies",fetch=FetchType.EAGER)
然后我得到了这个:
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
我是否必须创建另一个java类来映射COUNTRY_MOVIE
?或者有没有办法通过使用与现在相同的java类来解决这个问题?
章鱼
答案 0 :(得分:1)
您的映射没问题(您不需要第三类)。你也不需要急于获取。问题在于查询代码。您应该确保在访问集合时会话仍处于打开状态。
使用您的查询代码更新问题,我可以告诉您如何修复它。
答案 1 :(得分:0)
以下是MyDao.java
中的查询,可以查看所有国家/地区和电影。
@Transactional
public class myDao implements IMyDao, Serializable {
private static final long serialVersionUID = 1L;
@PersistenceContext
private EntityManager em;
public List<Country> getAllCountries() {
try {
return em.createQuery("select cou from Country cou").getResultList();
} catch (Throwable th) {
// Throw Exception
}
}
}
我假设我需要使用连接显式检索电影列表。
答案 2 :(得分:0)
首先在joinTable中,teh join列必须是国家/地区的外键inversjoin外键的电影:
@ManyToMany()
@JoinTable(
name="COUNTRY_MOVIE"
, joinColumns={
@JoinColumn(name="COUNTRY_ID")
}
, inverseJoinColumns={
@JoinColumn(name="MOVIE_ID")
}
)
private List<Movie> movies;
你可以获得这样的电影的所有国家:
public List<Country> getAllCountriesOfMovie(Integer id){
Query query=null;
query = session.createQuery("from Country as c left join"
+ " fetch c.movies as movie where movie.moId=:movieId");
query.setInteger("movieId", id);
return query.list();
}