2013-02-25 127 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