これは JAXB で機能しますが、ほとんどの作業は自分で行う必要があります。
あなたの例では、オブジェクトを予約するためのタイトルのシングルトン レジストリのようなルックアップ機能が必要です。
識別子 title は子要素であるため、JAXB が他の要素の前に title 要素にアクセスするという保証はありません。これを回避する最も簡単な方法は、アンマーシャラーによって作成された Book インスタンスからシングルトンの Book インスタンスにプロパティをコピーすることです。コールバックはこれafterUnmarsal
を行う場所です:
class Book {
// ...
private void afterUnmarshal(Unmarshaller reader, Object parent) {
Book singleton = BookRegistry.getInstance().getBook(this.title);
if (this.publisher != null) singleton.setPublisher(this.publisher);
if (this.author != null) singleton.setPublisher(this.publisher);
// ...
}
}
その場で XML ドキュメントからオブジェクトを登録する場合は、もう少し複雑です。あなたの場合、おそらく次のようなものが必要です。
class Book {
// ...
public void setTitle(String title) {
this.title = title;
Book singleton = BookRegistry.getInstance().getBook(this.title);
if (singleton == null) BookRegistry.getInstance().addBook(this.title, this);
}
}
ネストされた本がない限り、これは機能します。