2つのデータベースの同期を維持するために、XStreamを使用してオブジェクトをシリアル化するレガシーシステムに取り組んでいます。新しいオブジェクトは最初に一方のデータベースに格納され、次に格納されたオブジェクトがシリアル化されて送信され、もう一方のデータベースに格納されます。
最近まで、問題のオブジェクトの構造は次のようでした。
public class Project {
List<Milestone> milestones;
[...]
}
ただし、要件を変更した後の構造は次のようになります。
public class Project {
List<Goal> goals;
}
public class Goal {
List<Milestone> milestones;
}
目標について何も知らなかったレガシーデータのマイルストーンを維持するために、プロジェクトの最終的な構造は次のとおりでした。
public class Project {
List<Goal> goals;
List<Milestone> milestones;
}
したがって、プロジェクトからマイルストーンへの2つのパスがあり、1つは直接、もう1つは目標を通過します。この構造が逆シリアル化されて保存されると、問題が発生します。XStreamによって逆シリアル化されると、プロジェクトに接続されたマイルストーンのオブジェクトは、同じIDを持っていても、目標を介して接続されたオブジェクトとは直接異なるオブジェクトになります。
HibernateのSession#merge()を使用してこのオブジェクトを永続化する限り、merge()はdb識別子が同じである限りオブジェクト識別子を気にしないため、問題はありませんでした。
しかし、この目的でmerge()を使用することはできなくなり、代わりにSession#save()に依存する必要があります。そして、save()はオブジェクト識別子に注意してください!そのため、逆シリアル化されたオブジェクトを保存しようとすると、org.hibernate.NonUniqueObjectExceptionが発生します。
これを解決するための最も邪魔にならない方法は、可能であれば、XStreamにデータベースIDごとに1つのオブジェクトを作成させることだと思います。しかし、これは可能ですか?