0

我从这个Hibernate Mapping Cheat Sheet中获取以下多对多映射示例:

<class name="Foo" table="foo">
  ...
  <set role="bars" table="foo_bar">
     <key column="foo_id"/>
     <many-to-many column="bar_id" class="Bar"/>
  </set>
</class>

<class name="Bar" table="bar">
  ...
  <set role="foos" table="foo_bar" readonly="true">
    <key column="bar_id"/>
    <many-to-many column="foo_id" class="Foo"/>
  </set>
</class>

一个 Foo 有几个bars,一个 Bar 有几个foos。因为 Bar.foos 被声明为readonly,我想我只需要这个简单的方法:

public class Foo {
    public void addBar(Bar bar) {
        this.bars.add(bar);
    }
}

不是

public class Foo {
    public void addBar(Bar bar) {
        this.bars.add(bar);
        bar.foos.add(foo); // readonly
    }
}

我的猜测是我无法以这种方式确保一致性(将 加回FooBar。Hibernate 是否通过Bar.foos在我添加时自动更新来保证这种一致性Foo.bars,或者Bar.foos一旦初始化,集合是否是静态的?

例如,如果我这样做:

Foo foo = new Foo();
Bar bar = new Bar();

bar.getFoos().size(); // expected to return 0
foo.addBar(bar);
bar.getFoos().size(); // expected to return 1

的返回值size()会是我期望的吗?

我还找不到相关的文档,所以一个指针会很有帮助。

4

1 回答 1

0

其中一个参考应该被标记inverse="true",而不是只读的。

NH 不存储逆部分。但是,当然,当您使用这些对象时,您会在内存中遇到一致性问题。

查看参考文档,与连接表的双向关联,多对多

于 2011-08-30T06:37:08.243 回答