0

我在表ResultResultAux之间有一个 OneToMany 连接。我可以从Result检索一组ResultAux对象。之后,我将添加一些ResultAux对象进行设置,并在每个设置条目上使用合并将更改刷新到数据库中。像这样:

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>
4

2 回答 2

0

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

我认为对于您的数据库,休眠选择“序列”策略,这样您可能会通过以下代码遇到此问题(未插入数据库的记录可以具有分配的 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);

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

于 2012-05-07T08:34:15.260 回答
0

我不确定我的回答是否能解决您的问题,但要回到@EugenioCuevas 评论,我会做这样的事情来保留您的子实体:

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

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

于 2012-05-07T08:03:16.553 回答