我在与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上的文档,但似乎找不到。
-丹尼尔
您的映射是正确的,因此正将条目保存在数据库中。提取中的问题是 由于延迟初始化。
为了解决这个问题,将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 以获得更多信息。