采用第一种方法时,您的模型可能如下所示(假设 Parent 和 Child 是 AggregateRoot s):
public Class Parent {
private Long id;
}
public Class Child {
private Long id;
private Long parentId; // most orm need this field.
}
然后,您可以使用childRepository.findBy(parentId): List<Child>
检索属于 Parent 的所有孩子,并使用parentRepository.findBy(child.getParentId()):Parent
检索孩子的 Parent。但这不是你的情况,因为你说“但是,模型的一个不变量需要是这个顺序是明确定义的”。这导致了另一种方法: Parent 和 Child 作为 AggregateRoot 和 ValueObject 来保持关系:
public Class Parent {
private Long id;
private List<LineChild> children;
}
public class LineChild {
private int ordinal;
private Long childId;
}
public Class Child {
private Long id;
}
但是在我的过期时间里,大多数 orm 不支持这个(而是使用第二个数据库模式)。一些“half orm 工具”可以提供帮助,例如 iBATIS。
<resultMap class="Parent">
<property name="id" column="id" />
<property name="children" column="id" select="findChilren"/>
</resultMap>
<select id="findChilren" parameterClass="long" resultMap="LineChild">
select * from Child where parant_id = #parantId# order by ordinal
</select>
<resultMap id="LineChild" class="LineChild">
<property name="ordinal" column="ordinal" />
<property name="childId" column="id"/>
</resultMap>
但是你失去了一个 orm 框架的所有好处,比如动态更新等等。
或者,考虑最终的一致性?
最后但很困惑,为什么“一个孩子只能属于一个父母”?我有爸爸妈妈!:P