【问题标题】:ORM: OneToOne mapping on Non Primary-Key Join column - Book and Inventory mapped by ISBNORM:非主键连接列上的 OneToOne 映射 - 由 ISBN 映射的 Book 和 Inventory
【发布时间】:2010-10-14 19:39:47
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您必须将您的加入引用命名为其他名称。 isbn 已经是一列。试试这个:

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

    【讨论】:

      【解决方案2】:

      我怀疑这与这个问题有什么关系,但我想我还是会提出来以确保它不是被忽视的问题:

      注意使用时 referencedColumnName 到非主 键列,关联的类有 可序列化。

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

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

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

      【讨论】:

      • 库存是可序列化的。 OneToOne 默认是渴望的。我只是使用条件查询来选择按 ISBN 预订并检查我是否获得库存详细信息
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这不是问题。显示的代码仅供参考。真正的问题在于 OneToOne 的某个地方
        • 好的 - 你找到我了。我还没有在我的休眠项目上使用注释。您可以只检查数据是否确实具有关系。
        猜你喜欢
        • 2020-03-18
        • 2021-03-15
        • 2020-03-15
        • 2013-03-25
        • 1970-01-01
        • 2015-09-16
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多