7

ISBN 番号でマップされた Book モデルと Inventory モデルがありますが、ISBN はどちらの主キーでもありません。Books は Bookstore に属し、Inventory は Bookstores のグループ (BookstoreChain) に属します。在庫は BookstoreChain に属するすべての書店で共有されます。

本側で 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
}
4

4 に答える 4

3

結合参照に別の名前を付ける必要があります。isbn はすでに列です。これを試して:

@OneToOne(optional = true)
@JoinColumn(name = "inventory", referencedColumnName = "isbn",insertable = false, updatable = false)
Inventory inventory;
于 2009-06-15T18:49:12.423 に答える
1

これが問題と関係があるとは思えませんが、見落とされた落とし穴ではないことを確認するために、とにかくそれを持ち出すと思いました:

referencedColumnName を非主キー列に使用する場合、関連付けられたクラスは Serializable である必要があることに注意してください。

参照: [ http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html][1]

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

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

于 2009-03-24T01:06:25.447 に答える
1

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

于 2009-06-09T00:16:29.977 に答える
0

推測: name = 'ISBN' は Inventory のフィールドと同じケースである必要がありますか?

于 2009-03-22T10:22:15.627 に答える