【问题标题】:bidirectional one-to-many with jointable可连接的双向一对多
【发布时间】:2012-03-10 18:20:00
【问题描述】:

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

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

-丹尼尔

【问题讨论】:

  • 为什么在派生实体 (B) 中使用不同的连接表?
  • 抱歉,我更新了问题。原因是我为示例修改了实际的两个类(基本上将它们重命名为 A 和 B :))
  • 好的。请将您遇到的错误添加到问题中。
  • 您的问题解决了吗?我看不到任何 cmets 或接受的答案?

标签: java hibernate


【解决方案1】:

您的映射是正确的,这就是该条目被保存在数据库中的原因。获取问题是因为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 了解更多信息。

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2014-02-10
    • 2014-11-15
    • 2019-07-18
    相关资源
    最近更新 更多