我目前正在开发一个小型PoC项目,并决定将NHibernate用于持久性部分。
我已经定义了以下域实体:
要求:
以下是我如何映射上述类
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="AET.PoC.Domain" namespace="AET.PoC.Domain.Entities">
<class name="Location" table="Locations" abstract="true">
<id name="Id" type="Int64" unsaved-value="0">
<generator class="native" />
</id>
<property name="LocationType" access="readonly" />
</class>
<joined-subclass name="FixedLocation" table="FixedLocations" extends="Location" abstract="true">
<key column="LocationId" />
<component name="GPSPosition" class="GPSPosition">
<property name="Latitude" type="double" />
<property name="Longitude" type="double" />
</component>
</joined-subclass>
<joined-subclass name="Country" table="Countries" extends="FixedLocation">
<key column="FixedLocationId" />
<property name="Name" length="50" not-null="true" />
<set name="CitySet" cascade="all, delete-orphan" inverse="true">
<key column="CountryId" foreign-key="FK_City_Country" on-delete="cascade" />
<one-to-many class="City" />
</set>
</joined-subclass>
<joined-subclass name="City" table="Cities" extends="FixedLocation">
<key column="FixedLocationId" />
<many-to-one name="Country" class="Country" column="CountryId" not-null="true" cascade="all, delete-orphan" />
<property name="Name" length="50" not-null="true" />
</joined-subclass>
</hibernate-mapping>
以这种方式映射这些类可以满足上述要求,或者至少部分地......
当我删除()一个国家实体(比如位置ID 1)有2个关联的城市对象(比如位置ID 2和3)时,会发生这种情况:
到目前为止,这么好,但是......
我在这里做错了什么?这可以在第一时间完成吗?
我尝试在标记中设置 on-delete =“cascade”属性,但是NHibernate抱怨不允许循环级联...
答案 0 :(得分:0)
不要在城市中进行多对一的级联。而是确保每个位置都知道子位置:
<class name="Location" table="Locations" abstract="true">
....
<many-to-one name="_parent" column="ParentLocationID" />
....
<set name="_childLocations" table="Locations" inverse="true" cascade="all-delete-orphan" >
<key column="ParentLocationID" />
<one-to-many class="Location"/>
</set>
....
</class>
通过这种方式,您可以使层次结构和对象生命周期正常工作并正确级联。您可以在子类中考虑其他要求。