次のエンティティがあります。
@Entity
public class Foo {
@ManyToOne(optional = false) // I've tried @OneToOne also, same result
@JoinColumn(name = "bar_id")
private Bar bar;
// this is a business key, though not mapped as unique for legacy reasons
@Column(nullable = false)
private long fooNo;
// getters/setters + other properties
}
@Entity
public class Bar {
@OneToOne(optional = true, mappedBy = "bar", cascade = CascadeType.ALL)
private Foo foo;
// getters/setters + other properties
}
注:これは正しいマッピングです: @ManyToOne と @OneToOne (私が設計したものではありません)。@OneToOne も両側で試しましたが、同じ結果になりました。
基本的に、Foo オブジェクトなしで Bar を作成できますが、Foo を作成するたびに、それに関連付けられた Bar が必要です。Foo は親オブジェクトと見なされますが (これが関連付けの所有者である理由です)、Bar は場合によっては単独で使用できます。
Foo
次に、次のようなオブジェクトをロードします。
SELECT f FROM Foo f WHERE f.fooNo = :fooNo
foo.getBar()
期待どおり、適切な を正しくフェッチしますBar
。しかし、foo.getBar().getFoo()
ですnull
。この関係の反対側は、JPA/hibernate によって正しく初期化されていないようです。なぜこれが起こっているのか、どうすれば修正できるのでしょうか?
JPA 実装として Hibernate 3.2.1 を使用します。これは、EJB3 Bean を介して使用しています (ただし、これはおそらく関係ありません)。