【问题标题】:How do I get hibernate to eagerly fetch EmbeddedId?如何让休眠状态急切地获取 EmbeddedId?
【发布时间】:2021-11-21 19:15:40
【问题描述】:

我偶尔会收到以下错误:

org.hibernate.LazyInitializationException: could not initialize proxy [com.dd.translation.domain.postgres.Offer#OfferKey(offerId=03Y, difId=b3e79b1925ce4e41905a2ce214943d1f)] - no Session

可嵌入:

@Builder
@Embeddable
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OfferKey implements Serializable {

    @Column(name = "offer_id", columnDefinition = "CHARACTER VARYING(64) NOT NULL")
    private String offerId;

    @Column(name = "dif_id", columnDefinition = "CHARACTER VARYING(64) NOT NULL")
    private String difId;

}

嵌入对象:

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table(name = "offers")
public class Offer {

    @EmbeddedId
    private OfferKey offerId;
    private LocalDateTime validDate;
}

这个项目中没有其他延迟加载,我不认为我需要@Transactional。我试图弄清楚是否有办法手动将其设置为渴望,或者是否有人遇到了这个问题。我个人不使用这种模式,但它存在于现有代码中,我正在尝试弄清楚是否需要将其删除或是否有简单的修复方法。

【问题讨论】:

    标签: java spring-boot hibernate lazy-initialization


    【解决方案1】:

    错误告诉您您尝试访问的 Offer 对象未初始化,而不是嵌入的 id。

    我猜你的一个模型中有这样的东西:

    @ManyToOne(fetch = FetchType.LAZY)
    Offer offer;
    

    无论您在何处加载包含该关联的实体,您都必须确保报价已正确初始化,因为调用代码显然希望它可以访问报价详细信息。

    您可以将 FetchType 更改为 EAGER,但我不建议这样做。更好的解决方案是在指示它加载关联的存储库方法上应用@EntityGraph

    【讨论】:

      猜你喜欢
      • 2015-06-28
      • 2023-03-24
      • 1970-01-01
      • 2023-04-06
      • 2014-07-31
      • 2012-05-11
      • 2013-05-22
      • 1970-01-01
      • 2015-07-22
      相关资源
      最近更新 更多