java - 当使用与主键不同的列(referencedColumnName)映射关系时,如何阻止 Hibernate 急切地获取关系?

标签 java hibernate

我正在映射不使用实体主键的关系。使用与主键不同的列的“referencedColumnName”会导致 hibernate 通过发出额外的选择来急切地获取关联,即使它被标记为 FetchType.LAZY。

我的目标是使其表现得像常规映射,这意味着每次我需要查询主实体时它都不会发出额外的查询。

我已经尝试过使用 @LazyToOne(LazyToOneOption.NO_PROXY) 来解决问题,但它与 Jackson 的(JSON 解析库)模块“jackson-datatype-hibernate5”配合使用效果不佳,该模块在以下情况下会跳过 hibernate 延迟代理:序列化结果。

这是一种几乎与我遇到的导致问题的情况类似的情况: 实体:

@Entity(name = "Book")
@Table(name = "book")
public class Book
    implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    private String title;

    private String author;

    @NaturalId
    private String isbn;

    //Getters and setters omitted for brevity
}

@Entity(name = "Publication")
@Table(name = "publication")
public class Publication {

    @Id
    @GeneratedValue
    private Long id;

    private String publisher;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(
        name = "isbn",
        referencedColumnName = "isbn"
    )
    private Book book;

    @Column(
        name = "price_in_cents",
        nullable = false
    )
    private Integer priceCents;

    private String currency;

    //Getters and setters omitted for brevity
}

存储库(Spring-Data,但您可以直接使用EntityManager尝试):

@Repository
public interface PublicationRepository extends JpaReadRepository <Publication, Long>
{
    @Query ("SELECT d FROM Publication d WHERE d.publisher = ?1 ")
    Optional <Publication> findByPublisher (String isbn);
}

谢谢

最佳答案

实现您正在寻找的内容的唯一方法是将注释 @Id 移动到 isbn 属性。

您可以将 @GenerateValue 保留在自动增量属性上。

注释:

1 - 确保您的 equals/hc 遵循域中的 OID(对象 ID)(案例“NaturalId”ISBN)。

2 - 如果可能的话,最好在数据库级别确保您的自然 ID 具有唯一的约束。

关于java - 当使用与主键不同的列(referencedColumnName)映射关系时,如何阻止 Hibernate 急切地获取关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56059823/

相关文章:

java - 重命名所有 java 类、字段和方法的简单方法?

java - 两列之间差异的 Hibernate 标准

mysql - Hibernate 不生成唯一约束

java - Spring 启动 : Export identifier encountered more than once

java - 使用oop java计算两点之间的线长

Java程序无限循环,没有任何错误信息

java - 如何将我的通话设置为对其他人保密?

java - 如何根据两个数组列表的大小将其排序到一个新的数组列表中

java - 使用 Hibernate 查找包含 100 万条记录的表

java - 如何在 Java 中调用这个 PLSQL 过程?