2017-02-07 9 views
0

古いサードパーティ製のアプリケーションによって作成された古い組み込みDBFデータベースの変更をチェックする必要があります。私はそのアプリケーションのソースコードにアクセスすることはできず、データベースにトリガーなどを置くことはできません。ビジネスの制約のために私はそれを変更することはできません...コレクションの変更をリッスンする方法は?

私の目標は、さらに処理するためのJavaアプリケーションとそのデータベースのテーブル(〜1500年の記録)から、新しいレコード、削除されたレコードや変更されたレコードを取得することです。データベースはJPA/Hibernate with HXTT DBFドライバを使ってSpringアプリケーションからアクセスできます。

私は今、データベース内のサードパーティのアプリケーションによる変更を効率的に取得する方法を検討しています。

テーブル全体を定期的に読んで、各レコードが変更されていないかどうか、または2回の読み取りでdiffを適用する必要がありますか? Javaアプリケーションで設定できる「トリガー」の種類はありますか?それらの変更を正しく聞くには?

答えて

1

データが変更されたときにデータベースからコールバックを取得するためのJPAメカニズムはありません。

唯一の選択肢は、独自の変更検出を構築することです。通常は、追加、削除、およびまだ存在するエンティティを検出することから始めます。まだ存在している場合は、変更されているかどうかを確認する必要があります。したがって、エンティティにはequals()メソッドが必要です。 あなたは今、あなたは簡単に取り外し、追加の3セットを生成するためにグアバのSetsメソッドを使用することができたら、すべての主キーのセットを取得する必要があり、既存の(前となりますので、エンティティは、その主キーによって識別されます)、 このような。

List<MyEntity> old = new ArrayList<>(); // load from the DB last time 
List<MyEntity> current = new ArrayList<>(); // loaded from DB now 

Map<Long, MyEntity> oldMap = old.stream().collect(Collectors.toMap(MyEntity::getId, Function.<MyEntity>identity())); 
Map<Long, MyEntity> currentMap = current.stream().collect(Collectors.toMap(MyEntity::getId, Function.<MyEntity>identity())); 

Set<Long> oldKeys = oldMap.keySet(); 
Set<Long> currentKeys = currentMap.keySet(); 

Sets.SetView<Long> deletedKeys = Sets.difference(oldKeys, currentKeys); 
Sets.SetView<Long> addedKeys = Sets.difference(currentKeys, oldKeys); 
Sets.SetView<Long> couldBeChanged = Sets.intersection(oldKeys, currentKeys); 

for (Long id : couldBeChanged) { 
    if (oldMap.get(id).equals(currentMap.get(id))) { 
     // entity with this id was changed 
    } 
} 
関連する問題