🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 1.3.6\. 使双向连起来 首先请记住,Hibernate并不影响通常的Java语义。 在单向关联的例子中,我们是怎样在`Person`和`Event`之间创建联系的?我们把`Event`实例添加到`Person`实例内的event引用集合里。因此很显然,如果我们要让这个关联可以双向地工作,我们需要在另外一端做同样的事情 - 把`Person`实例加入`Event`类内的Person引用集合。这“在关联的两端设置联系”是完全必要的而且你都得这么做。 许多开发人员防御式地编程,创建管理关联的方法来保证正确的设置了关联的两端,比如在`Person`里: ``` protected Set getEvents() { return events; } protected void setEvents(Set events) { this.events = events; } public void addToEvent(Event event) { this.getEvents().add(event); event.getParticipants().add(this); } public void removeFromEvent(Event event) { this.getEvents().remove(event); event.getParticipants().remove(this); } ``` 注意现在对于集合的get和set方法的访问级别是protected - 这允许在位于同一个包(package)中的类以及继承自这个类的子类可以访问这些方法,但禁止其他任何人的直接访问,避免了集合内容的混乱。你应尽可能地在另一端也把集合的访问级别设成protected。 `inverse`映射属性究竟表示什么呢?对于你和Java来说,一个双向关联仅仅是在两端简单地正确设置引用。然而,Hibernate并没有足够的信息去正确地执行`INSERT`和`UPDATE`语句(以避免违反数据库约束),所以它需要一些帮助来正确的处理双向关联。把关联的一端设置为`inverse`将告诉Hibernate忽略关联的这一端,把这端看成是另外一端的一个_镜象(mirror)_。这就是所需的全部信息,Hibernate利用这些信息来处理把一个有向导航模型转移到数据库schema时的所有问题。你只需要记住这个直观的规则:所有的双向关联需要有一端被设置为`inverse`。在一对多关联中它必须是代表多(many)的那端。而在多对多(many-to-many)关联中,你可以任意选取一端,因为两端之间并没有差别。 让我们把进入一个小型的web应用程序。