具有连接表的双向一对多

Jus*_*yul 12 java 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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

如果我创建了A和B的实例,请将B的实例添加到A并保存.有用.但是当我重新加载A的实例并尝试访问B组时,它会抛出一个带有"非法访问加载集合"消息的LazyInitializationError.

我在哪里错了?:)任何人都可以指向一个使用连接表的双向关联的例子.如果所有权保留在A类,我已经搜索了hibernate.org上的文档,但我似乎无法找到它.

-Daniel

Man*_*uPK 7

您的映射是正确的,这就是条目保存在数据库中的原因.提取中的问题是由于惰性初始化.

要解决它,修改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;
} 
Run Code Online (Sandbox Code Playgroud)

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

请阅读此处的API 以获取更多信息.