Layz 加载列表在与 EntityManager 分离时重置

Layz loaded list gets reset upon detach from EntityManager

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

加载一个 Bp 包括相关的 BpHistorisiert id do

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

这工作正常,对 getBpHistorisiertList() 的调用按预期延迟加载 n 侧。但是,当 bp 分离时,bp 中的 bpHistorisiert 列表明确重置为 null。我可以在调试器中看到,这是由 OpenJPA EntityManager.

的分离功能明确完成的

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

Bp

@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;

}

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

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

感谢@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