【问题标题】:Why many-to-one bidirectional association requires update and insert set to false为什么多对一双向关联需要更新和插入设置为假
【发布时间】:2014-01-08 02:31:48
【问题描述】:

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

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

如果你使用 List 或其他索引集合,请将 key 列设置为 外键不为空。 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 给出的cmets,这不应该发生。如果我误解了这个概念,请告诉我。

【问题讨论】:

    标签: java oracle hibernate


    【解决方案1】:

    考虑 Hibernate 文档中的示例。我可以尽我所能提供帮助。

    @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) 用部队创建士兵并将其保存在士兵表上。**

    **考虑这是由部队实体管理的,您必须在其中进行以下交易

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

    2) 创建士兵。

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

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

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

    我认为这与您设计应用程序的方式有关,这些关系应该是您想要管理的关系以及从何处管理。

    【讨论】:

    • 非常感谢您的回复。我在这里几乎没有疑问。在您给出的示例中,您提到的连接列的名称是troop_fk,但我在Soldier 表中看到troop_id 作为外键,它们是否相同?接下来是您在第二种情况下提到的 3 点,我知道将在Soldier 表中插入一条新记录,然后运行update 查询以更新外键,在这种情况下为troop_id。那么我的理解正确吗?在第一种情况下,将有一个插入查询来保存士兵记录。
    • 是的,很抱歉造成混乱。它应该是troop_id。是的,部队实体的第二种方法发生了过度更新。
    • 感谢您的澄清。我在这里还有一个疑问,因为hibernate肯定必须在两种情况下都执行插入查询来保存士兵实体那么insert="false"是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2021-09-22
    • 2011-07-17
    • 2022-07-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    相关资源
    最近更新 更多