2013-02-25 128 views
0

我已經在過去的3天,仍然無法弄清楚。從概念上講,我需要設計一個信封對象及其來往地址(對象)。我有以下的數據庫架構(我不能改變):一對一N​​Hibernate映射

表信封

  • EnvelopeId(PK)
  • 列表項
  • PostmarkDate

表地址

  • EnvelopeId(PK,FK in Envelope)
  • AdressType(1 - 從地址,2 - 對於要把地址)
  • 國家
  • 郵編

*上(EnvelopeId,AdressType)

我的班唯一contraint如下:

public class Envelope 
{ 
public virtual long EnvelopeId { get; set; } 
public virtual DateTime PostmarkDate { get; set; } 
public virtual Address FromAddress { get; set; } 
public virtual Address ToAddress { get; set; } 
} 


public class Address 
{ 
public virtual AddressId { get; set; } 
public virtual Envelope Envelope { get; set; } 
public virtual AdressType { get; set; } 
public virtual Street { get; set; } 
public virtual State { get; set; } 
public virtual ZipCode { get; set; } 
} 

因此,Envelope最終有兩個對應的地址條目(帶有主鍵):一個具有AddressType 1和一個具有AddressType 2.我沒有包含映射文件,因爲這是問題所在。我嘗試了幾種解決方案:

  1. Envelope和Address之間的一對一關係。我在信封映射文件中有兩個一對一標記,地址映射文件中有一對一標記。地址映射文件在Envelope上也有一個外部生成器和一個constrained =「true」。 NHibernate抱怨Envelope和Address之間的一對一映射令人困惑。

  2. 創建了2個FromAddress和ToAddress類,這兩個類都來自Address。信封類現在有一個FromAddress和一個ToAddress(而不是2個地址)。我爲繼承實現了表級類層次結構。在我的地址映射中,我有:外部生成器,2個子類標記,鑑別器值和與Envelope的一對一關係。但NHibernate抱怨不喜歡歧視和一對一。於是我把一對一的標籤移到了子類標籤中。現在NHibernate抱怨不知道什麼是信封屬性(「無法解析屬性:信封」)

任何幫助,將不勝感激。

+0

您的課程不符合您的表格。在信封中,刪除地址欄。adressFrom和addressTo變量將具有(應該有)指向信封的指針。 – dmaij 2013-02-25 19:22:39

+0

我確實希望在信封和地址之間的類中建立雙向關係。關係是Envelope有一個Address From和一個Address To,並且這些地址屬於Envelope。最好的情況是,我可以在Address中使用Envelope成員變量,但我無法從Envelope類中刪除FromAddress和ToAddress成員變量。感謝您的回覆。 – MrTibs 2013-02-25 21:35:31

+0

您是否使用XML映射或通過代碼或流利映射? – Rippo 2013-02-26 08:14:47

回答

0

當然信封應該是一個一對多的地址?這是一個信封可以有很多地址(這將是未來證明你的代碼,如果你有超過兩個地址在未來)

但我不知道爲什麼你不能得到table-per-subclass(使用鑑別器)工作因爲你還沒有發佈你的映射。當地址從信封繼承時,您不需要從地址返回信封的雙向引用。

+0

感謝您關注此問題。我需要在現有數據庫之後對我的類進行建模 - 我的模式無法更改。從概念上講,信封有一個發件人地址和一個發件人地址。它沒有多個地址,我不認爲這將在未來發生變化。地址不會從Envelope繼承。信封「有一個」發件人地址和信封「有一個」發信地址「。這不是一種繼承關係。我不得不創建2個類:從地址繼承的FromAddress和ToAddress只是爲了使這項工作......不幸的是我不能。我得到:「無法解析財產:信封」在保存時間 – MrTibs 2013-02-26 18:46:43

+0

這裏是我的代碼: [鏈接](http://pastebin.com/w2XPDdgb) 和 [鏈接](http://pastebin.com/8wVkzygR) – MrTibs 2013-02-26 18:47:06

+0

我不是很熟悉的休眠,但我認識到這個問題,所以我可能把你在正確的軌道上,希望專家將進一步解釋。它看起來好像你必須在地址的定義中預先定義信封,這是編程時常見的錯誤,所以我希望這有助於。 – dmaij 2013-02-27 11:57:24