hibernate - 带有关联表的 JPA 注解

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

实体关系

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

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

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

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

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

国家

但我在 Country.java 中使用了 @JoinTable,如下代码所示:

//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...
}

问题 1:LazyInitializationException

我不知道这是否是管理这种关联表的最佳方式,即使它看起来还不错。

但是当我尝试获取一部电影的所有国家/地区时,我从 Hibernate 获得了一个 LazyInitializationException

问题 2:在我尝试 FetchType.EAGER

之后

所以我尝试为每个多对多注解添加一个 fetch EAGER:

国家:

@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(

电影中:

@ManyToMany(mappedBy="movies",fetch=FetchType.EAGER)

然后我得到这个:

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons

问题

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

最佳答案

您的映射没问题(您不需要第三类)。您也不需要使其急切获取。问题出在查询代码上。您应该确保在访问集合时 session 仍处于打开状态。

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

https://stackoverflow.com/questions/13095850/

相关文章:

php - DOMDocument::save[domdocument.save]:无法打开流:权限

winapi - 使用 NtOpenKey 时重定向注册表访问的正确方法是什么?

c# - PDFSharp 使用 PdfTextField 作为位置和大小引用在 pdf 中插入图像

nginx - 在 nginx 托管上出现 502 错误网关错误

authentication - 如何使用 JavaMail 调试 SMTP 身份验证错误?

c# - 执行相机预览镜像模式的正确方法

python - 是否可以在 Pandas 中将 searchsorted 与 MultiIndex

python - 组装字节码 - PyCode New

html5-video - HTML5 视频自动播放是否适用于三星智能电视?

python - 故意在python中制作一个孤儿进程