Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ORM:非主键联接列上的OneTONE映射-图书和库存由ISBN映射_Java_Hibernate_Orm_Activerecord_One To One - Fatal编程技术网

Java ORM:非主键联接列上的OneTONE映射-图书和库存由ISBN映射

Java ORM:非主键联接列上的OneTONE映射-图书和库存由ISBN映射,java,hibernate,orm,activerecord,one-to-one,Java,Hibernate,Orm,Activerecord,One To One,我有一个图书模型和库存模型,由ISBN编号映射,但ISBN不是其中的主键。书籍属于书店,库存是针对一组书店(书店连锁店)。库存由属于连锁书店的所有书店共享 我在书端使用Hibernate@OneToOne映射,通过加入ISBN列来获取库存信息。不知何故,Hibernate正确地生成了左侧外部联接查询,但Book对象上的inventory为null。它也不是懒惰的。忽略书店和连锁店,我如何在取书时加入OneOne或ManyOne并获取库存 class Book{ @Id Long id @Col

我有一个图书模型和库存模型,由ISBN编号映射,但ISBN不是其中的主键。书籍属于书店,库存是针对一组书店(书店连锁店)。库存由属于连锁书店的所有书店共享

我在书端使用Hibernate@OneToOne映射,通过加入ISBN列来获取库存信息。不知何故,Hibernate正确地生成了左侧外部联接查询,但Book对象上的inventory为null。它也不是懒惰的。忽略书店和连锁店,我如何在取书时加入OneOne或ManyOne并获取库存

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
}

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

我怀疑这与问题有关,但我想我无论如何都会提出它,以确保这不是一个被忽略的问题:

请注意,当使用 将ReferenceColumnName指定给非主 键列,则关联的类具有 可序列化

参考:[

我知道您说过正在生成左外部联接,但是我认为如果没有指定默认的fetch,则默认的fetch是惰性的。也许,明确指定fetch模式可能会产生不同的结果


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

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

您必须命名join引用其他内容。isbn已经是一列。请尝试以下操作:

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

这不是一个问题。显示的代码只是指示性的。真正的问题在于OneToOne的某个地方-你明白了。我还没有在我的hibernate项目上使用注释。你可以检查数据是否确实有关系。库存是可序列化的。OneToOne默认情况下是急切的。我只是使用一个条件查询来选择ISBN的图书d检查我是否得到库存详细信息