[英]nhibernate composite-id with not existing key-many-to-one record
我有舊的遺留數據庫,它們的表中有無效鏈接。 我在nhibernate中映射了這樣的類:
<class name="Visible" table="table_visible">
<composite-id>
<key-many-to-one column="object_id" name="ObjectA" />
<key-many-to-one column="sub_object_id" name="SubObject" />
</composite-id>
<property column="visible" name="VisibleRow" />
</class>
和:
public class Visible
{
public virtual ObjectAClass ObjectA { get; set; }
public virtual SubObjectClass SubObject { get; set; }
public virtual bool VisibleRow { get; set; }
public override bool Equals(object obj)
{
var other = ((Visible)obj);
return this.ObjectA.Equals(other.ObjectA) && this.SubObject.Equals(other.SubObject);
}
public override int GetHashCode()
{
return this.ObjectA.GetHashCode() + (this.SubObject != null? this.SubObject.GetHashCode(): 0);
}
}
現在,當數據庫中的所有聯接正確時,所有方法都可以正常工作,但是當我找到沒有實體的sub_object_id時,nhibernate會拋出錯誤
No row with the given identifier exists:[SubObject#123]
有沒有辦法映射復合鍵,以便在找不到其子實體時不會加載整個實體(就像內部聯接一樣)?
NHibernate v2.0.50727
遵循Daniel Schilling的想法,其中使用where exist子查詢來獲取Visible實體,發現映射中有可用的loader
元素。
<class name="ObjectA" table="table_object">
.........
<set name="VisibleList" cascade="all" lazy="false" inverse="true">
<key column="object_id" />
<one-to-many class="Visible" />
<loader query-ref="valid_entities"/>
</set>
</class>
<sql-query name="valid_entities">
<load-collection alias="v" role="ObjectA.VisibleList"/>
SELECT {v.*}
FROM table_visible v
INNER JOIN table_sub_entities e ON e.sub_entity_id=v.sub_entity_id
WHERE v.object_id=?
</sql-query>
無需更改任何其他內容。
<key-many-to-one column="sub_object_id" name="SubObject" not-found="ignore" />
...可能會有所幫助。 從NHibernate文檔中 ...
ignore
會將缺失的行視為空關聯
請注意與使用此選項相關的性能損失。 每當NHibernate獲取Visible
實體時,它也必須獲取SubObject
。 如果您不繼續在查詢中獲取它,則意味着NHibernate將發出大量延遲加載。
這不符合您的“當找不到其子實體時,將不會加載整個實體”的目標。 相反,NHibernate將為您提供一個具有空子實體的實體。 如果您想要這種類似於內部SubObject
行為,那么我認為您需要使用where exists
子查詢來獲取Visible
實體,以確保SubObject
實際上存在。
最好的選擇是修復數據庫中的數據並添加外鍵約束。
我只是碰到了這一點: 與not-found =“ ignore”的關系 。 我保證我不會復制Ricci的內容-我是根據自己的經驗編寫的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.