如果我使用具有复合ID和版本号的实体,我会在Hibernate' merge()
上遇到奇怪的行为。
这是我的hibernate映射文件:
<class name="ArticleTurnover" table="T_ARTICLETURNOVER">
<composite-id>
<key-property name="mainArticleId" type="java.lang.Integer" column="ARTICLETURNOVER_ID"/>
<key-property name="locationId" type="java.lang.Integer" column="ARTICLETURNOVER_LOCATIONID"/>
</composite-id>
<version name="version" column="ARTICLETURNOVER_VERSION" />
... some properties
</class>
这是代码(它失败了......):
ArticleTurnover at = new ArticleTurnover();
at.setMainArticleId(1);
at.setLocationId(1);
ArticleTurnover savedAt = em.merge(at);
assertNotNull(savedAt.getMainArticleId());
assertNotNull(savedAt.getLocationId());
调用merge
后,字段mainArticleId和locationId都是null
。上面的代码只是一个测试,但是如果我提交一个事务,hibernate会将null插入到composite-id字段中,然后失败!
如果我将em.merge(at)
更改为em.persist(at)
,一切正常。如果我手动设置at.setVersion(0)
(!!)它也可以。
我最后为我的复合ID添加了一个组件类型ArticleTurnoverId
,如下所述:http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#d0e4819。
有人可以告诉我我做错了什么,或者指出为什么会这样?