一尘不染

双向一对多连接

hibernate

我在与JoinTables进行双向一对多关联时遇到了一些问题。这就是我得到的:

A类:

@OneToMany
@JoinTable(name="join_table", 
    JoinColumns={@JoinColumn(name="a_id")},
    inverseJoinColumns={@JoinColumn(name="b_id")}
)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
public Set<B> getBs() {
    return bs;
}

B类:

@ManyToOne
@JoinTable(name="join_table", 
    joinColumns={@JoinColumn(name="b_id", insertable=false,updatable=false)},
    inverseJoinColumns={@JoinColumn(name="a_id", insertable=false,updatable=false)})
public A getA() {
    return a;
}

如果创建A和B的实例,请将B的实例添加到A并保存。有用。但是,当我重新加载A的实例并尝试访问B的集合时,它将引发LazyInitializationError并显示消息“对加载集合的非法访问”。

我在哪里错了?:)谁能指出我一个使用联接表的双向关联示例。在所有权保留为A类的地方,我搜索了hibernate.org上的文档,但似乎找不到。

-丹尼尔


阅读 176

收藏
2020-06-20

共1个答案

一尘不染

您的映射是正确的,因此正将条目保存在数据库中。提取中的问题是 由于延迟初始化

为了解决这个问题,将A类的映射修改为

@OneToMany(fetch=FetchType.LAZY)
@JoinTable(name="join_table", 
    joinColumns={@JoinColumn(name="a_id")},
    inverseJoinColumns={@JoinColumn(name="b_id")}
)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
public Set<B> getBs() {
    return bs;
}

这将对表B触发附加查询并初始化集合。它可能会影响性能,具体取决于被告表中条目的数量。

此处阅读API 以获得更多信息。

2020-06-20