我有一个由ISBN编号映射的Book模型和Inventory模型,但ISBN也不是主要密钥。书籍属于Bookstores,而Inventory是针对一组书店(BookstoreChain)。库存由属于BookstoreChain的所有书店共享。
我正在书侧使用Hibernate @OneToOne映射来加入ISBN列来获取库存信息。不知何故,Hibernate正确生成左外连接查询,但库对象上的库存为空。它也不是懒惰的。忽略书店和连锁店,如何在提取书籍时进行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
}
答案 0 :(得分:3)
您必须将连接引用命名为其他内容。 isbn已经是一个专栏。试试这个:
@OneToOne(optional = true)
@JoinColumn(name = "inventory", referencedColumnName = "isbn",insertable = false, updatable = false)
Inventory inventory;
答案 1 :(得分:1)
我怀疑这与这个问题有什么关系,但我认为无论如何我都会提出这个问题,以确保它不会被忽视:
注意使用时 referencedColumnName为非主要 键列,关联类有 是可序列化的。
参考:[http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html][1]
我知道你说正在生成LEFT OUTER JOIN,但是如果没有指定,我认为默认的提取是LAZY。也许,明确指定获取模式可能会产生不同的结果。
最后,如果您正在使用HQL查询,或者将其与任何其他实体类一起发布,将有助于社区帮助解决问题。
答案 2 :(得分:1)
根据您在此处显示的内容,您的数据库架构没有意义。书籍和库存之间的关系应该是一对多的 - 可能是同一本书存在于几个库存中,这意味着你不能将书籍和库存与isbn联系起来。由于isbn在库存中并不是唯一的,因此库存中有多行具有相同的isbn但不同的chainIds - 哪一行是给定book / isbn的右行? Book应该有inventory.id的外键,而不是inventory.isbn。
答案 3 :(得分:0)
只是一个猜测:name ='ISBN'是否需要与Inventory中的字段相同?