私は Nhibernate と非常に単純な親子関係で次の問題を抱えています。
Save、Update、Delete の 3 つのリスナーがあります。永続化されるオブジェクトが IAuditCreate インターフェイスを実装する場合、CreatedDate フィールドを割り当てます。
親のマッピング
<hibernate-mapping assembly="Model" namespace="Model" xmlns="urn:nhibernate-mapping-2.2">
<class name="SecSession" table="SEC_SESSION" lazy="true" >
<id name="SecSessionId">
<column name="SEC_SESSION_ID" sql-type="bigint" not-null="true" />
<generator class="identity" />
</id>
<property name="CreatedDate">
<column name="CREATED_DATE" sql-type="datetime" not-null="true" />
</property>
<bag name="SecSessionLogs" inverse="true" cascade="all-delete-orphan" >
<key column="SEC_SESSION_ID" />
<one-to-many class="SecSessionLog" />
</bag>
</class>
</hibernate-mapping>
私の子のマッピング
<hibernate-mapping assembly="Model" namespace="Model" xmlns="urn:nhibernate-mapping-2.2">
<class name="SecSessionLog" table="SEC_SESSION_LOG" lazy="true" >
<id name="SecSessionLogId">
<column name="SEC_SESSION_LOG_ID" sql-type="bigint" not-null="true" />
<generator class="identity" />
</id>
<many-to-one lazy="false" name="SecSession">
<column name="SEC_SESSION_ID" sql-type="bigint" not-null="true" />
</many-to-one>
<property name="LogMessage" type="StringClob">
<column name="LOG_MESSAGE" sql-type="nvarchar(max)" not-null="true" />
</property>
<property name="CreatedDate">
<column name="CREATED_DATE" sql-type="datetime" not-null="true" />
</property>
</class>
</hibernate-mapping>
そこで、SecSession オブジェクトを作成してから、SecSession.AddLog(new SecSessionLog) を呼び出します。
持続するために、私は次のことを行います。
using (var dataSession = DataStore.OpenDataSession())
using (var transaction = dataSession.BeginTransaction())
{
var id = (PK)dataSession.Save(secSession);
transaction.Commit();
return id;
}
マッピングが示すように、保存するために SecSessionLog を明示的に送信しません: CASCADE=ALL-DELETE-ORPHAN.
したがって、ここでの問題は、リスナーが子 Log オブジェクトに対して呼び出されないため、CreatedDate フィールドが空になり、データベースで null 値の例外が発生することです。
マッピングで構成する必要があるものはありますか? リスナーで?
あなたの助けは大歓迎です!
皆さんありがとう