gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:55:10 26 4
gpt4 key购买 nike

我正在映射不使用实体主键的关系。使用与主键不同的列的“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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com