在标题为“多值关联”一节的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版本都是一样的。
答案 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
无法实现这一限制。
解决方法是改为使用bag
或set
,并将索引映射为常规属性。