带关联表的JPA注释

时间:2012-10-26 23:51:15

标签: hibernate jpa annotations many-to-many associations

我正在使用带有Hibernate的JPA注释,我真的不知道如何管理关联表。

这是我的数据库:

| COUNTRY |      | COUNTRY_MOVIE|      | MOVIE   |
|---------|      |--------------|      |---------|
| COU_ID  |*    *| COUNTRY_ID   |*    *| MO_ID   |
| LABEL   |<---->| MOVIE_ID     |<---->| LABEL   |
|---------|      |--------------|      |---------|

COUNTRY_MOVIECOUNTRYMOVIE之间的关联表,具有多对多关联

在我的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类来解决这个问题?

章鱼

3 个答案:

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