Hibernate 带有关联表的JPA注释
我在Hibernate中使用JPA注释,但我真的不知道如何管理关联表 这是我的数据库:Hibernate 带有关联表的JPA注释,hibernate,jpa,annotations,many-to-many,associations,Hibernate,Jpa,Annotations,Many To Many,Associations,我在Hibernate中使用JPA注释,但我真的不知道如何管理关联表 这是我的数据库: | COUNTRY | | COUNTRY_MOVIE| | MOVIE | |---------| |--------------| |---------| | COU_ID |* *| COUNTRY_ID |* *| MO_ID | | LABEL |<---->| MOVIE_ID |<---->|
| COUNTRY | | COUNTRY_MOVIE| | MOVIE |
|---------| |--------------| |---------|
| COU_ID |* *| COUNTRY_ID |* *| MO_ID |
| LABEL |<---->| MOVIE_ID |<---->| LABEL |
|---------| |--------------| |---------|
在Movie.java
中,我只使用了@manytomy
注释:
//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...
}
电影中:
@ManyToMany(mappedBy="movies",fetch=FetchType.EAGER)
然后我得到这个:
org.springframework.beans.factory.support.DefaultSingletonBean注册销毁单例
我是否必须创建另一个java类来映射国家电影
?或者有没有办法通过使用与现在相同的java类来解决这个问题
Tako您的映射是正确的(您不需要第三个类)。你也不需要让它变得很快。问题在于查询代码。访问集合时,应确保会话仍处于打开状态
用您的查询代码更新问题,我可以告诉您如何解决它。以下是我在
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
}
}
}
@Transactional
公共类myDao实现IMyDao,可序列化{
私有静态最终长serialVersionUID=1L;
@持久上下文
私人实体管理者;
公共列表getAllCountries(){
试一试{
返回em.createQuery(“从国家/地区cou中选择cou”).getResultList();
}捕获(可丢弃){
//抛出异常
}
}
}
我假设我需要使用联接显式检索电影列表。首先在joinTable中,join列必须是国家/地区的外键,而join列必须是电影的外键:
@ManyToMany()
@JoinTable(
name="COUNTRY_MOVIE"
, joinColumns={
@JoinColumn(name="COUNTRY_ID")
}
, inverseJoinColumns={
@JoinColumn(name="MOVIE_ID")
}
)
private List<Movie> movies;
@ManyToMany()
@可接合(
name=“乡村电影”
,连接柱={
@JoinColumn(name=“COUNTRY\u ID”)
}
,反向连接列={
@JoinColumn(name=“MOVIE\u ID”)
}
)
私人电影名单;
你可以为这样一部电影赢得所有国家:
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();
}
公共列表getAllCountriesOfMovie(整数id){
Query=null;
query=session.createQuery(“从国家/地区作为c左连接”
+“获取c.movies作为电影where movie.moId=:movieId”);
query.setInteger(“movieId”,id);
返回query.list();
}
没关系,我找到了解决问题的方法,方法是使用一个左连接。如果在getAllCountries中编写代码来迭代Country集合并访问getMovies()集合,它将起作用。如果你试着用另一种方法去做,那是行不通的。若要修复此问题,您需要将@Transactional注释移动到更高级别(服务或控制器),或者如果是web应用程序,则需要使用OpenSessionInViewFilter。原因是entityManager在使用@Transactional调用该方法之前打开,在从该方法返回之前关闭。
@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();
}