NHibernate一对多实体映射 - 密钥列是否可以为空?

时间:2011-04-02 08:29:10

标签: java .net hibernate nhibernate

在标题为“多值关联”一节的Java Persistence with Hibernate一书中,有一个示例,其中父对象(Item)包含关联实体对象(Bid)的列表。该示例位于我的版本的第290页。

<hibernate-mapping>
  <class name="com.shane.Hibernate1.Item" table="Item">
    <id name="ItemId" column="ItemId">
      <generator class="increment"/>
    </id>

    <property name="Synopsis" column="Synopsis"/>

    <list name="bids" cascade="save-update">
      <key column ="ItemId" not-null="true"/>
      <list-index column="Sequence"/>
      <one-to-many class="com.shane.Hibernate1.Bid"/>
    </list>    
  </class>
</hibernate-mapping>  

<hibernate-mapping>
  <class name="com.shane.Hibernate1.Bid" table="Bid">
    <id name="BidId" column="BidId">
      <generator class="increment"/>
    </id>    
    <property name="synopsis" column="Synopsis"/>
  </class>
</hibernate-mapping>

我在NHibernate上尝试了以下2.1.2.GA和3.1.0.GA:

 Item item = new Item();
 item.setSynopsis("Item 1");

 Bid bid = new Bid();
 bid.setSynopsis("Bid1");     
 item.getBids().add(bid);

 session.save(item);

NHibernate首先在Item中插入一个新行然后尝试在Bid中插入一行但是失败,因为如果表将这些列设置为not null,它不包括ItemId和Sequence列。如果我使这些列可以为空,那么它可以工作,因为它会对Bid进行更新以设置它们,但我不希望它们可以为空。

我尝试使用Hibernate 3.1.rc2并且它可以工作 - 当它执行插入时它提供所有值但奇怪的是它仍然在Bid表上更新了ItemId和Sequence。

这是NHibernate中的错误吗?我希望这种行为对于java和.Net版本都是一样的。

3 个答案:

答案 0 :(得分:0)

我似乎是这样的解决方案......

出价出价=新出价(); session.save(BID);

Item item = new Item(); item.getBids()。add(new Bid(bid.getBidId())); session.save(项目)。

其中In BID()类应该有一个参数化构造函数。

我希望它运作正常......

答案 1 :(得分:0)

我认为Item类应该有多对一的引用。所以你应该保存Item。然后在bid(bit.getItem(item))中设置引用并保存出价。

答案 2 :(得分:0)

使用NHibernate,如果在集合中需要非空外键,则需要双向关系。阅读http://www.nhforge.org/doc/nh/en/index.html#collections-onetomany

末尾的注释

这肯定是对NH最需要的更改之一,它不一定与Hibernate 100%的时间匹配;它只是基于它。


更新:遗憾的是,这种限制使得list无法实现这一限制。

解决方法是改为使用bagset,并将索引映射为常规属性。