7

我有一个由 ISBN 编号映射的 Book 模型和 Inventory 模型,但 ISBN 不是两者的主键。书籍属于书店,库存是一组书店(书店链)。库存由属于 BookstoreChain 的所有书店共享。

我在图书端使用 Hibernate @OneToOne 映射通过加入 ISBN 列来获取库存信息。不知何故,Hibernate 正确地生成了左外连接查询,但 Book 对象的库存为空。它也不是延迟加载的。忽略书店和连锁店,我如何在获取书籍时进行 OneToOne 或 ManyToOne 加入并获取库存?

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 时,关联的类必须是可序列化的。

参考:[ 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

根据您在此处显示的内容,您的数据库架构没有意义。book 和inventory 之间的关系应该是一对多的——大概同一本书在几个inventory 中,这意味着您不能仅将books 和inventory 与isbn 相关联。由于 isbn 在库存中不是唯一的,因此您将在库存中有多行具有相同的 isbn 但不同的链 ID - 哪一行是给定书籍/isbn 的正确行?图书应该有一个外键inventory.id,而不是inventory.isbn。

于 2009-06-09T00:16:29.977 回答
0

只是一个猜测:name = 'ISBN' 是否需要与 Inventory 中的字段相同?

于 2009-03-22T10:22:15.627 回答