2012-02-20 69 views
12

我在使用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的实例并尝试访问B的集合时,它会抛出LazyInitializationError,并显示消息“非法访问加载集合”。

我在哪里错了? :)任何人都可以指出我使用连接表的双向关联的例子。在所有权保留给A类的地方,我已经通过hibernate.org的文档进行了搜索,但我似乎找不到它。

-Daniel

+0

为什么在派生实体(B)中使用不同的连接表? – Perception 2012-02-20 12:04:07

+0

对不起,我更新了这个问题。原因是我修改了这个例子的实际的两个类(基本上把它们重命名为A和B)) – JustDanyul 2012-02-20 12:11:21

+0

好的。请将您遇到的错误添加到问题中。 – Perception 2012-02-20 12:20:26

回答

7

你的映射是正确的,这就是为什么该条目得到保存在数据库中。由于Lazy Initialization,提取中的问题是

为了解决它修改类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 here了解更多信息。