我有一个enity'Foo',它包含一组值对象'Person',person包含简单属性,如“name”和一组值对象'NameChange',它是有关以前人名的信息。
我想把它映射为:
<class name="Foo">
<bag name="Persons">
<composite-element class="Person">
<property name="Name"/>
<bag name="NameChanges"> <!--WRONG-->
<composite-element class="NameChange">
<property name="ExName"/>
</composite-element>
</bag>
</composite-element>
</bag>
</class>
但NH不允许这种映射。
如何在值对象中映射值对象的集合?
答案 0 :(得分:1)
检查文档:
支持组件集合(例如,Name类型的数组)。通过用标记替换标记来声明组件集合。
<set name="SomeNames" table="some_names" lazy="true">
<key column="id"/>
<composite-element class="Eg.Name, Eg"> <!-- class attribute required -->
<property name="Initial"/>
<property name="First"/>
<property name="Last"/>
</composite-element>
</set>
注意:如果定义复合元素的ISet,则正确实现Equals()和GetHashCode()非常重要。
复合元素可能包含但不包含集合。如果复合元素本身包含组件,请使用
<nested-composite-element>
标记。 这是一个非常奇特的案例 - 一系列组件本身就有组件。在这个阶段你应该问自己一对多关联是否更合适......
所以回答你的问题:
如何在值对象中映射值对象的集合?
不要那样做。创建一级公民实体,并使用one-to-many
映射它们。一旦你被要求提供过滤,你会获得很多...
也许检查类似的内容here ...我的建议/建议是:主要使用one-to-many
和many-to-one
...我做99.7%的案例< / em>的