2

ユーザーとその外部表現の間の OneToOne 関係をマップするために、休止状態 (3.6.0) Join 関係を使用しています。

パフォーマンス ガイダンスにより、1 対 1 のマッピングではなく 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" が hibernate によって無視された理由を理解したいと思います。

4

1 に答える 1

0

問題は逆にあると思います。リレーションシップのデフォルトの Inverse は false です。逆プロパティの意味は、基本的に関係の所有者です。

あなたの例では、Hibernate は InternalUser を関係の所有者と見なします。そのため、ExternalUser を削除すると、1 対 1 の関係で所有者が InternalUser であるため、Hibernate は InternalUser が存在する必要がないと判断します。

したがって、InternalUser を削除してから、ExternalUser を削除します。

関係に Inverse=true を追加して、動作が変わるかどうかを確認してください...

于 2013-10-09T10:59:37.467 に答える