考虑下面的映射文件。这两个类都有不同的businessId概念,对象模型处理它,但是可以将它作为普通字符串存储在一列中。我也希望它们各自与Allocations集具有相同的关系,这是我希望它们使用继承映射的主要原因。
虽然项目的业务ID与账户相同的可能性今天很小,但如果有办法使businessId和discriminator的组合成为自然id的一部分,那将是理想的。这是不允许的,也许是因为我没有看到的一些好理由。
我能以一种明显的方式改进这种映射吗?
干杯,
Berryl
<class name="ActivitySubject" table="ActivitySubjects" discriminator-value="BASE_CLASS">
<id name="Id" unsaved-value="0">
<column name="ActivitySubjectId" />
<generator class="hilo" />
</id>
<discriminator column="ActivitySubjectType" type="System.String" />
<natural-id mutable="true">
<property name="BusinessId" length="25" not-null="true" />
</natural-id>
<property name="Description" length="75" not-null="true" />
<set access="field.camelcase-underscore" cascade="all-delete-orphan" inverse="true" name="Allocations">
<key foreign-key="Allocations_Resource_FK">
<column name="ActivityId" />
</key>
<one-to-many class="Allocation />
</set>
<subclass name="Account" discriminator-value="ACCOUNT" />
<subclass name="SProject" discriminator-value="PROJECT" />
这是我最终让两个列成为同一个唯一索引的一部分的方式:
<discriminator type="System.String" >
<column name="ActivitySubjectType" unique-key="ActivitySubjectTypeBusinessId" />
</discriminator>
<property name="BusinessId" length="25" not-null="true" node="1" unique-key="ActivitySubjectTypeBusinessId"/>
答案 0 :(得分:3)
不要将自然ID用于主键。我将使用合成密钥,数据库生成的标识或主键的GUID,并在BusinessId和ActivitySubjectType的组合上添加唯一约束。