2

我正在使用休眠(3.6.0)加入关系来映射用户与其外部表示之间的 OneToOne 关系。

由于性能指导,我们使用 Join 而不是一对一映射。问题是每当删除 ExternalUser 时,Hibernate 也会删除 InternalUser
,尽管

on-delete="noaction"
根据休眠参考禁用级联删除。
第 5.1.21 节。键:http ://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html

类的映射:

<class name="com.example.ExternalUser" table="externalusers" dynamic-update="true" dynamic-insert="true" schema="mySchema">
  <id name="externalUserGuid" >
    <column  name="externalUserGuid"  sql-type="uniqueidentifier"/> <generator class="guid"/>
  </id>
  <property name="id"    column="Id" update="false"/>
  <property name="name"    column="Name"/>
  <property name="lastName"    column="LastName"/>
  <join table="users" optional="true" schema="mySchema" >
    <key   column="GUID" on-delete="noaction" update="false"/> 
    <property name="userId" column="Id" update="false" />       
  </join>         
</class>


<class name="com.example.InternalUser" table="users" dynamic-update="true" dynamic-insert="true" schema="mySchema">
  <id name="id" column="Id">
    <generator class="assigned"/>
  </id>    
  <property name="userName" column="UserName" />    
  <property name="password" column="Password" />    
  <property name="registrationStatus" column="Enabled" />
  <property name="unlockedAt" column="UnlockedAt" />
  <property name="registeredAt" column="RegisteredAt" />    

如果我将反向属性添加到 Join 标签它会解决问题,但是我想了解为什么 on-delete="noaction" 被休眠忽略。

4

1 回答 1

0

我相信问题在于逆。默认情况下,关系上的 Inverse 为 false。逆属性的含义基本上就是谁是关系的所有者。

在您的示例中,Hibernate 将 InternalUser 视为关系的所有者。因此,当您删除 ExternalUser 时,Hibernate 决定 InternalUser 不需要存在,因为它是一对一的关系并且所有者是 InternalUser。

因此,您将先删除 InternalUser,然后再删除 ExternalUser。

尝试在你的关系上添加一个 Inverse=true 并查看行为是否改变......

于 2013-10-09T10:59:37.467 回答