@OneToMany 某些实体未检索到持久性集

@OneToMany Persistence Set is not retrieved for some entities

我一直在寻找解决我的问题的方法,但目前卡住了。

我有一个 spring-批处理应用程序,它从我的数据库中检索实体以删除它们。 该批处理在 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(),没有自定义)。

然而,这并不完全适用于一台服务器,尤其是一个实体(也许还有其他服务器,但批处理在此级别抛出异常)。

我已经检查了数据库约束、数据和所有我能检查的内容,数据库实际上是相同的,所以没有理由不删除表中的 entity/the 行。

Spring-批处理块大小在每个执行批处理的 server/machine 上都是相同的,肯定使用相同版本的 Java(pom.xml 文件是一样)。

任何帮助 and/or 的想法都非常受欢迎。 谢谢。

编辑 1:忘记了异常:

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

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

我已通过从数据库中删除 'false data' 解决了这个问题。

虽然这不是理想的解决方案,但一位同事可能已经解决了这个问题,给了我一些 'persistence theory'。

他的想法是 Object2 的记录未恢复,实际上已被另一个用户的手动输入损坏。

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

更清楚:如果(例如)"VERSION" 注册表中的列 is/was 设置为“2”,则数据库包含“0”,那么 Java 对象将不会被恢复。 us/me更不可能说出修改了什么,就'persistence sensitive fields'而言,所以我们只能断定这是一个人为错误。

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