我有一个这样的模型:
class Foo
{
public IList<HistoryRecord> History {get;set;}
public HistoryRecord HistoryReference {get;} //Computed, null or item from History.
}
我厌倦了这样的地图:
<list name="History" cascade="all-delete-orphan" inverse="false" table="history">
<key column="foo_fk" not-null="true" update="false"/>
<index column="idx"/>
<one-to-many class="HistoryRecord" />
</list>
<many-to-one name="HistoryReference" cascade="none" access="readonly" column="history_ref" class="HistoryRecord"/>
它可以生成多余的SQL:
我想摆脱3.冗余更新并在插入期间设置history_ref。
答案 0 :(得分:0)
通过将多对一的级联顺序从NONE更改为ALL,我能够完成这项工作。
<many-to-one name="HistoryReference" cascade="ALL" access="readonly" column="history_ref" class="HistoryRecord"/>
但请注意,在此配置中,子项是在父项之前插入的,因此如果您对子级到父级链接有FK约束(并且您确实应该),则会抛出异常,因为您的子级引用了尚不存在的父级。要克服它,你必须在数据库中使用DEFERRABLE约束,这在事务提交时检查,而不是在插入时刻。