タイプ Video のオブジェクトがあります。ビデオをデータベースに保存していますが、各ビデオ エントリを一意にしたいと考えています。一意性は、クライアントから提供された 11 桁の文字列によって決定されます。
そのため、次の Video.hbm.xml ファイルを生成しました。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Streamus" namespace="Streamus.Domain">
<class name="Video" table="[Videos]" lazy="false" mutable="false">
<id name="Id" length="11" type="String" />
<property name="Title" not-null="true" />
<property name="Duration" not-null="true" />
<property name="Author" not-null="true" />
</class>
</hibernate-mapping>
このテーブルのエントリを削除または更新するつもりはありません。そのため、クラスを不変としてタグ付けしました。
さて、これはかなり良い方法だと思いましたが、親オブジェクトからのカスケード更新で問題が発生しています。私の ID はクライアント側で生成され、2 番目の識別子を利用しないため、NHibernate はビデオを挿入または更新する必要があるかどうかを確実に判断することができません (不変であるため更新されないことに注意してください)。
何かのようなもの:
Video video = new Video("s91jgcmQoB0", "Tristam - Chairs", 219, "MeoMix");
new VideoManager().Save(video);
// Create a new PlaylistItem and write it to the database.
string title = video.Title;
PlaylistItem playlistItem = new PlaylistItem(title, video);
Playlist.AddItem(playlistItem);
PlaylistManager.SavePlaylistItem(playlistItem);
ここで、PlaylistItem の hbm.xml は Video を次のように参照します。
<many-to-one name="Video" column="VideoId" not-null="true" cascade="save-update" />
上記のコードは、NonUniqueObjectException を生成します。これは、VideoManager が 1 つのセッションでビデオを操作し、それを閉じてから、PlaylistManager が新しいセッションで同じビデオを再参照するためですが、NHibernate は適切な ID を持っていないため対応できません。
cascade="save-update" のオプションを削除すると問題は解決しますが、NHibernate によってデータベース内に Video オブジェクトが暗黙的に作成される利点が得られません。代わりに、Video オブジェクトを手動で保存してから、PlaylistItem オブジェクトを保存する必要があります。これは明らかに理想的ではありません。
ビデオ オブジェクトに GUID を割り当てる必要があるのでしょうか。もしそうなら、一意性が 11 桁の文字列 ID によって定義されるテーブルに一意のビデオ エントリのみを持ちたいという事実を強制するにはどうすればよいですか?
これをより明確にするために、さらに情報を提供できるかどうか教えてください。