私は基本的な構造を持っています。UserオブジェクトとUserDetailsオブジェクト。UserテーブルにはUserIdを生成するためのIDプライマリキーがあり、このUserIdのUserDetailsオブジェクトも保存したいと思います。これを個別に行うのは簡単ですが、UserクラスにはUserDetailsオブジェクトへの参照が含まれているため、一度に実行できる方法を見つけようとしています。例えば
User u = new User(){Name = "me"、Age = 17、UserDetails = new UserDetails(){Detail1 = 1}};
したがって、私がしなければならないのは、ユーザーオブジェクトを渡すことだけです。これには、他の関連するサブ情報へのオブジェクトベースの参照が含まれます(この例では大幅に簡略化していますが、UserMatchConfigurationなどのUserDetailsと同様のクラスがいくつかあります。それぞれのフィールドの)
オブジェクトをコードで構築したり、オブジェクトを渡して変更したりしてから、親のUserオブジェクトでsaveを呼び出し、関連するすべてのオブジェクトを保存できるようにしたいです。これまで、1対1のマッピングと保存カスケードを使用してこれを達成しましたが、問題は、新しいオブジェクトを作成するときに、最初にUserクラスを保存するときに、関連するすべてのクラスのUserIdがゼロに設定されることです。生成されたUserIdを関連するすべてのクラスに伝播し、それらを保存します。
これまでのマッピングは以下のとおりです。
<class name="User" table="[User]">
<id name="UserId" unsaved-value="0">
<generator class="identity" />
</id>
<property name="FirstName" />
<property name="LastName" />
<property name="EmailAddress" />
<property name="DateOfBirth" />
<property name="Gender" />
<property name="PostcodePartOne" />
<property name="PostcodePartTwo" />
<many-to-one name="UserLocation" column="UserLocationId" />
<property name="DateJoined" />
<property name="LastLoggedOn" />
<property name="Status"/>
<property name="StatusNotes" />
<bag name="Photos" order-by="DisplayOrder asc" inverse="true" lazy="false" cascade="all">
<key column="UserId" />
<one-to-many class="UserPhoto" />
</bag>
<bag name="Interests" inverse="true" lazy="false" cascade="all">
<key column="UserId" />
<one-to-many class="UserMatchInterest" />
</bag>
<bag name="Preferences" inverse="true" lazy="false" cascade="all">
<key column="UserId" />
<one-to-many class="UserPreference" />
</bag>
<one-to-one name="Profile" class="UserProfile" cascade="save-update" />
<one-to-one name="MatchCriteria" class="UserMatchCriteria" />
<one-to-one name="MatchLifestyle" class="UserMatchLifestyle" />
<property name="LastUpdated" />
</class>
ご覧のとおり、今のところ、プロファイルオブジェクトを使用して試用し、機能させています。メインのUserオブジェクトが最初に保存し、次にUserIdを他のクラスに渡すようにするにはどうすればよいですか?すべてのクラスがそれを主キーとして使用しますか?
ここでも、カスケード保存を実行してから、各サブクラスでUserIdを手動で設定し、それらを個別に保存することはできませんでしたが、1回の呼び出しで実行しようとしています。