为什么多对一双向关联需要更新并将insert设置为false

时间:2014-01-06 20:13:23

标签: java oracle hibernate

Hibernate document说如果我想使用列表,那么我需要设置update="false" and insert="false"的属性。

请告诉我为什么需要这些属性以及这有什么用?

  

如果使用List或其他索引集合,请设置键列   外键不为null。 Hibernate将管理关联   从集合方面来维护每个元素的索引,   通过设置update =“false”来使对方实际上是反向的   插入= “假”:

<class name="Person">
   <id name="id"/>
   ...
   <many-to-one name="address"
      column="addressId"
      not-null="true"
      insert="false"
      update="false"/>
</class>

<class name="Address">
   <id name="id"/>
   ...
   <list name="people">
      <key column="addressId" not-null="true"/>
      <list-index column="peopleIdx"/>
      <one-to-many class="Person"/>
   </list>
</class>

我也经历过这篇文章Setting update and insert property in Hibernate,但是当我编写一个简单的程序来创建和保存我的Person和Address对象时,我可以看到addressId属性是由hibernate本身插入和更新的:

Hibernate: insert into Address (addressId) values (?)
Hibernate: insert into person1 (addressId, peopleId, personId) values (?, ?, ?)
Hibernate: insert into person1 (addressId, peopleId, personId) values (?, ?, ?)

09:19:08,526 DEBUG AbstractCollectionPersister:1205 - Inserting collection: [partc.onetomany1.Address.people#156]
Hibernate: update person1 set addressId=?, peopleId=? where personId=?
Hibernate: update person1 set addressId=?, peopleId=? where personId=?

但根据JB NizetThomas给出的评论,这不应该发生。如果我误解了这个概念,请告诉我。

1 个答案:

答案 0 :(得分:1)

考虑一下Hibernate Documentation中的示例。我可以尽力帮助。

@Entity
public class Troop {
    @OneToMany(mappedBy="troop")
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_id")
    public Troop getTroop() {
    ...
}  

在这种情况下,您的表结构将是

**Troop**
Troop_id | Troop_desc
T1       | Troop 1
T2       | Troop 2

**Soldier**
Soldier_Id | Troop_Id | Soldier_Name
S1         | T1       | XYZ
S2         | T2       | PQR

**考虑到在上述情况下你需要添加一个士兵,函数调用将是

1)用部队创建士兵并将其保存在士兵桌上。**

**考虑将其从Troop实体进行管理,您必须执行以下事务

1)你将士兵附加到部队实体中的士兵集合

2)创造士兵。

3)也更新部队实体。**

因此,这就是为什么在第二个条件下你有@OneToMany作为管理方面的插入和更新。

现在,回到为什么文档提到@ManytoOne JoinColumn应该是insertable = false,updateable = false是因为在第二种情况中,(@OneToMany一侧的关系是管理方)你会更新士兵通过更新部队实体。

我认为这与你如何设计应用程序的关系应该是你想要管理的关系以及从哪里开始。