3

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

实体关系

这是我的数据库模式作为实体关系(ER)图:

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

该表COUNTRY_MOVIE是多对多关联之间和具有多对多关联的关联表(由上面的箭头线表示,其中多对多由 表示)。COUNTRYMOVIE* *

使用 JPA 在代码中建模的实体

在我的 JPA 对象中,我没有创建一个CountryMovie.java类。

国家

但我@JoinTableCountry.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

问题

  1. 我是否必须创建另一个 java 类来映射COUNTRY_MOVIE
  2. 或者有没有办法通过使用与现在相同的java类来解决这个问题?
4

3 回答 3

1

您的映射没问题(您不需要第三类)。你也不需要让它急切地获取。问题在于查询代码。您应该确保在访问集合时会话仍处于打开状态。

用您的查询代码更新问题,我可以告诉您如何解决它。

于 2012-10-27T05:36:26.753 回答
1

首先在 joinTable 中,连接列必须是国家/地区的外键和电影的外键反转:

 @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();
   }
于 2017-07-14T12:36:29.613 回答
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
        }
    }
}

我假设我需要使用连接显式检索电影列表。

于 2012-10-27T09:11:43.843 回答