2009-05-08 6 views
10

私はHibernateで "0または1"の関係にマップしようとしています。私は多対1の方法を見つけたかもしれないと思う。1から0または1つのマッピングを冬眠させる

class A { 
    private B b; 
    // ... getters and setters 
} 

class B { 
    private A a; 
} 

クラスAのマッピングが指定されています。

<many-to-one name="b" class="B" 
insert="false" update="false" 
column="id" unique="true"/> 

とクラスBのマッピングを指定:Bに該当する行が見つからなかったときに私が希望何

<one-to-one name="a" class="A" constrained="true"/> 

はNULLにBのためでありますデータベースに格納されます。だから私はこれを(クラスAで)行うことができます:

if (b == null) 

しかし、bは決してnullではないようです。

私はこれについて何ができますか?

+0

私は答えを楽しみにしています – Schildmeijer

+0

「答えに」ofcourse – Schildmeijer

答えて

0

many-to-one要素にlazy = "false"を設定してみてください。これは、最初のオブジェクト( "A")がロードされたときに、Hibernateに関連付け(「B」)を取得させようとするはずです。 "A"のプロパティは、 "B"の実インスタンスまたはnullで初期化されます。

16

L:それは私はB.

詳細については、このスレッドを参照してくださいがなかったAをロードしHibernateObjectRetrievalFailureException毎回の結果IKEボーデンは、答えはアノテーションでこれを行うA.で多対1の文にnot-found="ignore"を追加することで、言った:クラスAでは

@Id 
@GeneratedValue(generator = "myForeignGenerator") 
@org.hibernate.annotations.GenericGenerator(
    name = "myForeignGenerator", 
    strategy = "foreign", 
    parameters = @Parameter(name = "property", value = "a") 
) 
private Long subscriberId; 

@OneToOne(mappedBy="b") 
@PrimaryKeyJoinColumn 
@NotFound(action=NotFoundAction.IGNORE) 
private A a; 
:クラスBで

@ManyToOne 
@Cascade({ CascadeType.ALL }) 
@JoinColumn(name = "Id") 
@NotFound(action=NotFoundAction.IGNORE) 
private B b 

関連する問題