我正在使用hibernate(3.6.0)加入关系来映射用户与其外部表示之间的OneToOne关系。
由于性能指导,我们使用Join而不是一对一映射。问题是
每当删除ExternalUser时,Hibernate也会删除InternalUser
尽管
上删除=“无动作”
根据hibernate引用禁用级联删除。
第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”被hibernate忽略。
答案 0 :(得分:0)
我认为问题出在Inverse上。默认情况下,对关系的反向为false。逆属性的含义基本上是谁是关系的所有者。
在您的示例中,Hibernate将InternalUser视为关系的所有者。所以当你删除ExternalUser时,Hibernate决定不需要存在InternalUser,因为它是一对一的关系而且所有者是InternalUser。
因此,您将删除InternalUser,然后删除ExternalUser。
尝试在您的关系中添加Inverse = true,并查看行为是否发生变化......