0

私は自分の問題の解決策をしばらく探していましたが、現在行き詰まっています。

データベースからエンティティを取得して削除するスプリング バッチ アプリケーションがあります。バッチは、4 つの環境のうち 3 つ (ローカル マシン、テスト サーバーなど) で問題なく動作します。

私のマシン上のアプリケーションで KO サーバー上のデータベースをテストすると、同じことが起こります。(そして、コードはすでに 4 つのインスタンスすべてで同じです)。

何が起こるかは次のとおりです。

私の最初のオブジェクト

@Table(name = "TABLE_1")
public class Object1 {
    ...
    @OneToMany(mappedBy="object1")
    private Set<Object2> myObj2 = new HashSet<Object2> ();
}

私の2番目のオブジェクト

@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()カスタムは何も使用しません)。

ただし、これは特定の 1 つのサーバー、特に 1 つのエンティティで完全に機能するわけではありません (他にも存在する可能性がありますが、バッチはこのレベルで例外をスローします)。

データベースの制約、データ、および確認できるすべてのものを確認しましたが、データベースは実質的に同一であるため、このエンティティ/テーブルの行が削除されない理由はありません。

Spring バッチのチャンク サイズは、バッチを実行するすべてのサーバー/マシンで同じであり、同じバージョンの Java が確実に使用されます (pom.xmlファイルは同じです)。

どんな助けやアイデアも大歓迎です。ありがとうございました。

編集1:例外を忘れました:

USER.FK_FROM_TABLE_2 : 次の外部キー: table_1 (ID) は table_2 で参照する必要があります

org.springframework.dao.DataIntegrityViolationException: 削除できませんでした: [Object1#14382]; SQL [テーブル 1 から削除します。ここで id=? バージョン=?]; 制約 [null];
    ネストされた例外は 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: ステップ実行 id=1 を間違ったバージョン (1) で更新しようとしています。現在のバージョンは 2 です
..
    fr.mma.soecm.batchpurgedonnees.Main.main (Main.java:89) で
14:42:48,481 ERROR [] [Main] - バッチが正常に完了しませんでした: status=UNKNOWN
4

1 に答える 1

0

データベースから「偽のデータ」を削除することで、この問題を修正しました。

これは理想的な解決策ではありませんが、同僚がおそらく問題を解決し、「持続性理論」を少し教えてくれました。

彼の考えは、その記録はObject2回復されず、実際には別のユーザーの手動入力によって破損しているというものです。

データベースが私たちのコードによって変更されたという他の兆候はなく、永続性 API を介してデータベースにアクセスする方法を見て、内部データベース レジストリは実際にデータベースにあるものと同期していないはずです。

より明確にするために:(たとえば)レジストリの「VERSION」列が「2」に設定されている場合、データベースに「0」が含まれていると、Javaオブジェクトは回復されません。さらに、「持続性に敏感なフィールド」に関して、何が変更されたのかを私たち/私が言うことは不可能であるため、これは人為的エラーであると結論付けるしかありません。

これが他の誰かにも役立つことを願っています。

于 2016-08-05T13:02:36.643 に答える