某些实体未检索到@O​​neToMany持久性集

时间:2016-08-04 13:51:10

标签: java jpa spring-batch javax.persistence

我一直在寻找解决问题的方法,目前我已经陷入困境。

我有一个弹簧批处理应用程序,它从我的数据库中检索实体以删除它们。 批处理在4个环境中的3个(本地计算机,测试服务器等)上工作得很好。

在K.O上测试数据库。服务器与我的机器上的应用程序做同样的事情。 (并且所有4个实例的代码都相同)。

以下是发生的事情:

我的第一个对象

@Table(name = "TABLE_1")
public class Object1 {
    ...
    @OneToMany(mappedBy="object1")
    private Set<Object2> myObj2 = new HashSet<Object2> ();
}

我的第二个对象

@Table(name = "TABLE_2")
public class Object2 {
    ...
    @NotNull
    @ManyToOne
    @Index(name = "FK_TABLE_1")
    @JoinColumn(name = "TABLE_1_ID", referencedColumnName = "id")
    private Object1 obj1;
}

现在,从逻辑上讲,我的批处理将获得Object1(确切地说,我将包含ParentObject个包含多个Object1个实体的Object2列表entity.remove()这样我就可以删除它们(使用pom.xml,无需自定义)。

然而,这并不完全适用于某个服务器,特别是在一个实体上(可能还有其他实体,但批处理会在此级别引发异常)。

我已经检查了数据库约束,数据以及我可以检查的所有内容,并且数据库实际上是相同的,因此应该没有理由不删除此实体/表中的行。

执行批处理的每台服务器/机器上的Spring批处理块大小相同,肯定使用相同版本的Java({{1}}文件是相同的)。

非常欢迎任何帮助和/或想法。 谢谢。

编辑1:忘记例外:

USER.FK_FROM_TABLE_2:一个外键,表示:table_1(id)必须在table_2中引用

org.springframework.dao.DataIntegrityViolationException: could not delete: [Object1#14382]; SQL [delete from table_1 where id=? and version=?]; constraint [null]; 
    nested exception is org.hibernate.exception.ConstraintViolationException: could not delete: [Object1#14382]
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:643)
..
    at fr.covea.troisma.soja.batch.BatchService.launchJob(BatchService.java:69)
    at fr.mma.soecm.batchpurgedonnees.Main.main(Main.java:89)
Caused by: org.hibernate.exception.ConstraintViolationException: could not delete: [Object1#14382]
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
..
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512)
    ... 22 more
Caused by: java.sql.SQLException: ORA-02292: constraint violation (USER.FK_FROM_TABLE_2)  - enregistrement fils existant

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
..
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2711)
    ... 34 more
14:42:48,480 ERROR [] [AbstractStep] - Encountered an error saving batch meta data. This job is now in an unknown state and should not be restarted.
org.springframework.dao.OptimisticLockingFailureException: Attempt to update step execution id=1 with wrong version (1), where current version is 2
..
    at fr.mma.soecm.batchpurgedonnees.Main.main(Main.java:89)
14:42:48,481 ERROR [] [Main] - Batch does not complete successfuly: status=UNKNOWN

1 个答案:

答案 0 :(得分:0)

我通过删除数据库中的“错误数据”来修复此问题。

虽然这不是理想的解决方案,但同事可能已经解决了这个问题,给了我一些“持久性理论”。

他的想法是Object2的记录,其中没有恢复,实际上其他用户的手动输入已经损坏。

由于我们的代码没有其他迹象表明数据库已被修改,并且看到通过持久性API访问数据库的方式,内部数据库注册表必须与数据库中的实际内容不同步。 / p>

更清楚一点:如果注册表中的(例如)“VERSION”列被设置为“2”,则将数据库包含为“0”,则Java对象将无法恢复。 对于我们/我来说,就“持久性敏感领域”来说,不可能说出被修改的内容,因此我们只能得出结论认为这是一个人为错误。

我希望这对其他人也有帮助。