【问题标题】:Layz loaded list gets reset upon detach from EntityManagerLayz 加载的列表在从 EntityManager 分离时重置
【发布时间】:2023-10-20 14:56:01
【问题描述】:

我有从BpBpHistorisiert 的惰性1:n 关系。

要加载一个Bp,包括相关的BpHistorisiert id 做

    Bp bp= entityManager.find(Bp.class, anId);
    bp.getBpHistorisiertList();

这工作正常,对getBpHistorisiertList() 的调用会按预期加载n 端惰性。但是,当 bp 分离时,bp 中的 bpHistorisiert 列表会显式重置为 null。我可以在调试器中看到,这是由 OpenJPA EntityManager 的分离功能明确完成的。

所以我的问题是:当我使用分离实体时,如何加载惰性关系并保留值?

血压

@Entity
@Table(name = "BP", schema = "INFOP_STAMMDATEN")
public class Bp extends BaseEntity implements EntityId, Serializable {

    /** technische ID */
    @Id
    @Column(name = ID)
    private Long id;

    @Valid
    @OneToMany(mappedBy = "bp", orphanRemoval = false, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<BpHistorisiert> bpHistorisiertList = new ArrayList<>();

}

BpHistorisiert

@Entity
@Table(name = "BP_HISTORISIERT", schema = "INFOP_STAMMDATEN")
public class BpHistorisiert implements EntityId, GueltigkeitOwner, AbkuerzungOwner, Serializable {

    @Id
    @Column(name = ID)
    private Long id;

    @NotNull
    @ManyToOne
    @JoinColumn(name = BP_ID)
    @ForeignKey
    private Bp bp;

}

【问题讨论】:

    标签: java jpa openjpa


    【解决方案1】:

    答案是:通过在 OpenJPA 问题跟踪器上报告问题并等待解决。

    根据the docs,您不应该观察到您描述的行为。

    【讨论】:

    • 不是我希望的答案,但至少为我指明了正确的方向。谢谢!
    【解决方案2】:

    感谢@crizzis 的回答,我找到了这种行为的原因。我们实际上已经设置了

    <property name="openjpa.DetachState" value="fetch-groups(DetachedStateField=true)"/>
    

    在我们的persistence.xml。结果是,所有实体的所有惰性文件在分离时都设置为 java 默认值。对于懒惰的List,这是null

    是的,这是 OpenJPA 的一项功能,而不是错误。

    毕竟这甚至被明确记录在案:https://issues.apache.org/jira/browse/OPENJPA-1913?attachmentSortBy=fileName

    【讨论】:

      最近更新 更多