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

我有一个按ISBN号映射的Book模型和Inventory模型,但ISBN不是其中的主键。 书籍属于Bookstores,而Inventory是针对一组书店(BookstoreChain)。 库存由属于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 } 

您必须将连接引用命名为其他内容。 isbn已经是一个专栏。 尝试这个:

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

我怀疑这与这个问题有什么关系,但我认为我会提出它只是为了确保它不是被忽视的陷阱:

请注意,将referencedColumnName用于非主键列时,关联的类必须是Serializable。

参考文献:[ http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html%5D [1 ]

我知道你说LEFT OUTER JOIN正在生成,但我认为默认的提取是LAZY,如果没有指定的话。 也许,明确指定获取模式可能会产生不同的结果。

最后,如果您正在使用HQL查询,也许可以将其与任何其他实体类一起发布,这将有助于社区帮助解决问题。

根据您在此处显示的内容,您的数据库架构没有意义。 书籍和库存之间的关系应该是一对多的 – 可能是同一本书存在于几个库存中,这意味着你不能将书籍和库存与isbn联系起来。 由于isbn在库存中并不是唯一的,因此库存中有多行具有相同的isbn但不同的chainIds – 哪一行是给定书籍/ isbn的右行? Book应该有inventory.id的外键,而不是inventory.isbn。

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