Hibernate:新旧记录

时间:2012-05-07 07:39:09

标签: java hibernate one-to-many hibernate-onetomany

我在表格结果 ResultAux 之间建立了OneToMany连接。我可以从结果中检索一组 ResultAux 对象。之后我添加了一些 ResultAux 对象来设置并在每个集合条目上使用 merge 来将更改刷新到数据库中。像这样:

Set<ResultAux> resultAuxes = result.getResultAuxes();
if (resultAuxes != null) {
    for (ResultAux resultAux : resultAuxes) {
        resultAux = getDaoFactory().getResultAuxDAO().merge(resultAux);
    }
}

对于我需要知道的一些其他操作,将条目设置为新记录并将插入到表中,或者它是旧记录,并且(已修改或未修改)将更新。我注意到 ResultAux 集的所有条目都已经有了ID,因此我无法像其他表那样检查 null 。有没有办法确定这样的事情(最好不要涉及额外的文件)?

编辑

<hibernate-mapping>
    <class name="ResultAux" table="RESULT_AUX">
        <id name="id" column="ID">
            <generator class="native" />
        </id>

        <property name="additinalInfoType" column="AITYPE" type="dao.hibernate.utl.AdditinalInfoEnumType" />
        <property name="sorter" column="SORTER" />
        <property name="value1" column="VAL1" />
        <property name="value2" column="VAL2" />

        <many-to-one name="result" column="RESULT_ID" class="Result" />
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="Result" table="RESULT">
        <id name="id" column="ID">
            <generator class="native" />
        </id>

        <property name="questionNumber" column="Q_NUM" />
        <property name="answerNumber" column="A_NUM" />
        <property name="questionGroup" column="Q_GRP" />
        <property name="answerValue" column="A_VAL" />
        <set name="resultAuxes" inverse="true" cascade="all-delete-orphan"
            lazy="false">
            <key column="RESULT_ID" />
            <one-to-many class="ResultAux" />
        </set>
    </class>
</hibernate-mapping>

2 个答案:

答案 0 :(得分:0)

我不确定我的答案会解决你的问题,但回到@EugenioCuevas评论,我会做这样的事情来坚持你的孩子实体:

Set<ResultAux> resultAuxes = result.getResultAuxes();
if (resultAuxes != null) {
    for (ResultAux resultAux : resultAuxes) {
        resultAux.setResult(result);
    }
}
getDaoFactory().getResultDAO().merge(result);

然后Hibernate应该自己管理关系。

答案 1 :(得分:0)

使用native作为主键生成策略会导致Hibernate选择identitysequencehilo作为PK生成策略,具体取决于底层数据库的功能。

我认为对于您的数据库,hibernate选择“序列”策略,以便您可能会遇到以下代码遇到此问题(未插入到DB的记录可以具有分配的ID):

Set<ResultAux> resultAuxes = result.getResultAuxes();
ResultAux  newResultAux = new ResultAux();

/**
 * As session.save()  requires to return the ID for the saved instance , if  "sequence" strategy is 
 * used , Hibernate will hit the DB  to select the next ID (eg. select some_seq.NEXTVAL) to be used 
 * for the saved instance. So newResultAux  will have an ID after save()  but actually it is not saved to 
 * the DB yet as  saving to the DB  occurs during session.flush()
 */
session.save(newResultAux);
resultAuxes.add(newResultAux);

其中一个解决方案是向ResultAux添加@Version属性。然后,您可以检查此@Version属性的值以确定它是否是新记录,因为新记录的@Version属性必须为NULL