1

这是官方Hibernate教程的摘录

首先,请记住 Hibernate 不会影响正常的 Java 语义。在单向示例中,我们如何在 Person 和 Event 之间创建链接?您将 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);
}

在这种情况下,“绝对”这个词是什么意思?:

  • 这意味着只要当前逻辑过程完成就建议保持关系一致,但显然会发生持久性?
  • 这意味着如果不设置对方(不拥有关系),就不能严格执行持久性?

换句话说,如果我的“添加”方法是:

public void addToEvent(Event event) {
    this.getEvents().add(event);
    //event.getParticipants().add(this); without this line
} 
4

3 回答 3

3

关系允许参与关系的bi-directional两个实体获得关系另一方的实体。当您插入这些参与双向关系的实体时,您负责管理关系的双方。

在您呈现的参与者/事件关系中,这是通过在关系的两侧设置适当的实体来完成的。

因此,如果您尝试为参与者添加事件,则必须将事件添加到参与者Collection<Event>,并且必须将参与者添加到事件的Collection<Participant>. 您不能简单地将事件添加到参与者的Collection<Event>并期望 hibernate 填充Participant事件的Collection<Participant>.

如果您未能将事件添加ParticipantCollection<Participant>事件中,Collection<Participant>则将与数据库不同步,并且可能无法插入,具体取决于已建立的约束和级联设置。

于 2014-01-26T21:54:50.337 回答
1

正如其他答案所指出的,休眠不会破坏正常的 Java 语义。将参与者添加到事件的集合中不会透明地将事件添加到参与者的集合中。负责设置它。

根据文档(不是教程):

仅对关联的反向端所做的更改不会保留。...非反面用于将内存中的表示保存到数据库中。

这是直接来自文档的代码示例Item是关联的反面:

category.getItems().add(item);          // The category now "knows" about the relationship
item.getCategories().add(category);     // The item now "knows" about the relationship

session.persist(item);                   // The relationship won't be saved!
session.persist(category);               // The relationship will be saved

总之,从我对文档的阅读来看,这并不是绝对必要的,但是未能将反向实体添加到非反向的集合中将导致关系无法保存。

于 2014-06-12T15:23:06.143 回答
0

这意味着当您添加关系的一侧时,两种数据结构的内存副本不会自动更新,因此当您的代码使用 Java 代理来处理数据库行时,您可能会向参与者的事件添加一个事件列表,但该事件不会显示参与者,并且(合理地)依赖于两者同步的任何代码都会失败。这是 JPA 中一个令人讨厌的陷阱,但它不是 Hibernate 特定的,而且似乎不会很快消失。

于 2014-01-26T21:55:09.110 回答