ORM:Non Primary-Key Join列上的OneToOne映射 - 按ISBN映射的Book和Inventory

时间:2009-03-22 09:12:29

标签: java hibernate orm activerecord one-to-one

我有一个由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
}

4 个答案:

答案 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中的字段相同?