我一直在寻找解决问题的方法,但目前陷入困境。
我有一个 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 错误 [] [主要] - 批处理未成功完成:状态 = 未知