我在表格结果和 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>
答案 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选择identity
,sequence
或hilo
作为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