2016-08-04 23 views
0

我一直在尋找解決我的問題的一段時間,並且目前被卡住了。@OneToMany持久性集不被檢索的一些實體

我有一個spring-batch應用程序,它從我的數據庫中檢索實體以刪除它們。 該批處理在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(),沒什麼習俗)。

但是,這並不完全在一臺服務器上工作,特別是在一個實體(特別是其他實體,但批處理引發此級別的異常)。

我檢查了數據庫的約束條件,數據以及我可以檢查的所有內容,並且數據庫實際上是相同的,所以應該沒有理由說這個實體/表中的行不會被刪除。

在執行批處理的每臺服務器/機器上,批處理塊大小是相同的,肯定使用相同版本的Java(pom.xml文件相同)。

任何幫助和/或想法都非常受歡迎。 謝謝。

編輯1:忘記了異常:

USER.FK_FROM_TABLE_2,外鍵,上面寫着:TABLE_1(標識)必須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

你能分享異常嗎? – duardito

+0

耶..形成。希望你明白這個主意。 – pegas

+0

您是否需要指定級聯選項以首先刪除關聯的集合,從而避免FK違規? http://www.objectdb.com/java/jpa/persistence/delete –

回答

0

,我已經修復這個問題通過從數據庫中刪除'虛假數據'。

雖然這不是一個理想的解決方案,但一位同事可能已經解決了這個問題,給了我一點「持久理論」。

他的想法是,Object2的記錄表明哪裏沒有恢復,哪裏實際上是被另一個用戶的手動輸入所損壞。

由於沒有其他的跡象表明數據庫已被我們的代碼修改,並且看到通過持久API訪問數據庫的方式,所以內部數據庫註冊表必須與數據庫中的實際內容不同步。要更加清楚:如果(例如)註冊表中的「VERSION」列被設置爲「2」,則將數據庫包含「0」,那麼Java對象將不會被恢復。 對於我們來說,在「持久性敏感領域」方面,我們還不可能說出什麼被修改了,所以我們只能得出這樣的結論:這是人爲錯誤。

我希望這可以幫助別人。

相關問題