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

我在Hibernate中使用JPA注释,但我真的不知道如何管理关联表

这是我的数据库:

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