在hibernate 3.6中使用composite-id和version的奇怪行为

时间:2014-07-07 10:44:02

标签: java hibernate

如果我使用具有复合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

有人可以告诉我我做错了什么,或者指出为什么会这样?

0 个答案:

没有答案