如何使用与主键不同的列(引用columnname)绘制映射时,如何阻止Hibernate急切地获取关系



我正在映射不使用实体的主键的关系。使用与主键不同的列"引用columnname",即使发出额外的选择,也会引起冬眠,即使使用fetchype.lazy。

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

我已经尝试使用@lazytoone(lazytooneoption.no_proxy(,它解决了问题,但与杰克逊(JSON解析库(模块" jackson-datatype-hibernate5"相对于杰克逊的(JSON解析库(的工作不佳序列化结果。

这几乎就像我所遇到的那种情况一样:实体:

@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属性。

您可以将@generatedValue放在自动插入属性上。

注意:

1-确保您的equals/hc遵循域案例上的OID(对象ID(" hantalid" ISBN。

2-最好在DB级别上确保您的自然ID在其上具有独特的矛盾。

最新更新