0

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

我有一个 spring-batch 应用程序,它从我的数据库中检索实体以删除它们。该批次在 4 个环境中的 3 个环境(本地计算机、测试服务器等)上运行良好。

用我机器上的应用程序测试 KO 服务器上的数据库做同样的事情。(并且所有 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(),没有自定义)。

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

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

Spring-batch 块大小在执行批处理的每台服务器/机器上都是相同的,肯定使用相同版本的 Java(pom.xml文件相同)。

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

编辑1:忘记了例外:

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

org.springframework.dao.DataIntegrityViolationException:无法删除:[Object1#14382];SQL [从 table_1 中删除其中 id=? 和版本=?]; 约束[空];
    嵌套异常是 org.hibernate.exception.ConstraintViolationException:无法删除:[Object1#14382]
    在 org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:643)
..
    在 fr.covea.troisma.soja.batch.BatchService.launchJob(BatchService.java:69)
    在 fr.mma.soecm.batchpurgedonnees.Main.main(Main.java:89)
引起:org.hibernate.exception.ConstraintViolationException:无法删除:[Object1#14382]
    在 org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
..
    在 org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76)
    在 org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512)
    ... 22 更多
引起:java.sql.SQLException:ORA-02292:违反约束(USER.FK_FROM_TABLE_2)-注册文件存在

    在 oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
..
    在 org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2711)
    ... 34 更多
14:42:48,480 ERROR [] [AbstractStep] - 保存批处理元数据时遇到错误。该作业现在处于未知状态,不应重新启动。
org.springframework.dao.OptimisticLockingFailureException:尝试使用错误的版本 (1) 更新步骤执行 id=1,其中当前版本为 2
..
    在 fr.mma.soecm.batchpurgedonnees.Main.main(Main.java:89)
14:42:48,481 错误 [] [主要] - 批处理未成功完成:状态 = 未知
4

1 回答 1

0

我已通过从数据库中删除“虚假数据”来解决此问题。

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

他的想法是,Object2那些没有恢复的记录,实际上是由另一个用户的手动输入损坏的。

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

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

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

于 2016-08-05T13:02:36.643 回答