2009-03-22 4 views
7

ISBN番号でマップされたブックモデルとインベントリモデルがありますが、ISBNはどちらのプライマリキーでもありません。書籍は書店に属し、在庫は書店のグループ用です(BookstoreChain)。在庫は、BookstoreChainに属するすべての書店で共有されます。ORM:Non Primary-Key Join列のOneToOneマッピング - ISBNによってマップされたブックとインベントリ

私は書籍側でHibernate @OneToOneマッピングを使用して、ISBN列に参加してインベントリ情報を取得しています。どういうわけか、Hibernateは左外部結合クエリを正しく生成しますが、在庫はBookオブジェクト上ではnullです。怠け者でもない。 BookstoreとChainを無視して、OneToOneやManyToOneを使ってBooksを取得したときに在庫を取得して取得するにはどうすればよいですか?

class Book{ 
@Id 
Long id 

@Column 
String isbn; 

@Column 
String title; 

@OneToOne(optional = true) 
@JoinColumn(name = "isbn", referencedColumnName = "isbn",insertable = false, updatable = false) 
Inventory inventory; 
} 

class Inventory{ 
@Id 
Long id 

@Column 
String chainId 

@Column 
String isbn 

@Column 
Long availableQty 
} 

答えて

0

「名前= 'ISBN'は在庫のフィールドと同じである必要がありますか?

+0

これは問題ありません。示されているコードは単なる指標である。本当の問題はOneToOneのどこかにある – Sathish

+0

ok - あなたは私を得ました。私はまだ休止状態のプロジェクトでアノテーションを使用していません。あなたは、データが実際に関係を持っているかどうかだけチェックするかもしれません。 – Martlark

1

私は、これは問題とは何かを持っていることを疑うが、私は、私はちょうどそれが見落とされた落とし穴ではないことを確認するために、とにかくそれを持ち出すだろうと思った:

注 を使用した場合ということreferencedColumnNameを非プライマリ キー列に設定すると、関連するクラスには がシリアライズ可能になります。

リファレンス:[http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html][1]

私はあなたがLEFT OUTER JOINをと言った知っているが生成されているが、私はそれが指定されていない場合、デフォルトのフェッチをLAZYだと思いました。おそらく、取得モードを明示的に指定すると、異なる結果が生じる可能性があります。

最後に、HQLクエリを使用している場合は、他のエンティティクラスと一緒に投稿するとコミュニティが問題を解決するのに役立ちます。

+0

インベントリはシリアライズ可能です。 OneToOneはデフォルトで熱望しています。私はちょうどISBNで予約を選択するために条件クエリを使用しています、私は在庫の詳細を取得するかどうかを確認しています – Sathish

1

データベースのスキーマは、ここに示した内容に基づいていません。本と在庫の関係は1対多でなければなりません。同じ本が複数の在庫にあると考えられます。つまり、書籍と在庫をisbnと単に関連付けることはできません。 isbnはインベントリ全体で一意ではないので、isbnは同じだが異なるchainIdsを持つインベントリ内に複数の行があるだろう - どの行が特定のbook/isbnの正しい行ですか?書籍には、inventory.isbnではなく、inventory.idへの外部キーが必要です。

3

あなたの参加参照には、何か他の名前を付ける必要があります。 isbnはすでに列です。試してみてください:

@OneToOne(optional = true) 
@JoinColumn(name = "inventory", referencedColumnName = "isbn",insertable = false, updatable = false) 
Inventory inventory; 
関連する問題