【问题标题】:Unable to lazily load JPA relationships无法延迟加载 JPA 关系
【发布时间】:2019-07-11 04:58:34
【问题描述】:

我正在与 Jhipster 合作。我无法懒惰地吸引客户。

我已经制作了这样的 JDL...

 PROPERTY
 id
 ...

 CUSTOMER
 id
 ...

 CUSTOMER_PROPERTY
 id
 customer_id
 property_id
 value

 relationship OneToMany {
    Customer to CustomerProperty                    
 }
 relationship ManyToOne {
    CustomerProperty to Property    
 }

我的域名

客户.java

 @OneToMany(mappedBy = "customer", fetch = FetchType.LAZY)
 @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
 private Set<CustomerProperty> customerProperties = new HashSet<>();

属性.java 没有映射

CustomerProperty.java

 @ManyToOne
 private Property property;

 @ManyToOne
 @JsonIgnoreProperties("customerProperties")
 private Customer customer;

我已经尝试显式设置 fetch = FetchType.LAZY,但它不断将完整的 Customer 对象与所​​有 CustomerProperties 列表一起提供

我想了解为什么 fetch 不起作用

【问题讨论】:

    标签: java database hibernate jpa persistence


    【解决方案1】:

    如果一个集合是否被延迟加载,调试不是一个好的评估机制。调试器本身可能会触发初始化。

    不要使用调试器,而是使用

    org.hibernate.Hibernate.isInitialized(yourCollection) 
    

    在加载实体后验证它是否已初始化。

    如果此方法返回 false,但您仍然怀疑稍后会初始化集合,您应该在可能的后续调用(其他地方)中搜索错误。

    【讨论】:

    • 为什么即使我第一次运行该应用程序也会获取关系?
    • 在您的存储库调用之后显然没有获取它。要么您在调试期间获取它,要么稍后再获取它。
    • 我仍然不明白你是如何得出它已被提取的结论的。如果您是根据 100% 错误的调试器得出这个结论,我已经告诉过您原因。如果您有其他理由这么认为,请指定它们。你的调试器不是一个好理由。
    • 天啊,我发现了问题(或者我应该说你帮了我很多)。你会想杀了我 :) 它是调用 getCustomerProperties 的映射器类,它依次调用 getProperty 等等......但现在我知道下次我将使用 Hibernate.isInitialized(collection)。非常感谢队友。继续努力!!!
    猜你喜欢
    • 2014-03-06
    • 2014-12-14
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2016-01-09
    • 2011-10-02
    • 2021-02-04
    • 2011-07-27
    相关资源
    最近更新 更多