@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'而言,所以我们只能断定这是一个人为错误。
我希望这对其他人也有帮助。
我一直在寻找解决我的问题的方法,但目前卡住了。
我有一个 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'而言,所以我们只能断定这是一个人为错误。
我希望这对其他人也有帮助。