为什么Lazy Collections不能与JavaFX getter / setter一起使用?

时间:2017-10-26 15:19:26

标签: jpa javafx eclipselink lazy-loading

使用em.find(entity, primaryKey)时,我的表现不佳。 原因似乎是em.find()还将加载使用FetchType.LAZY注释的实体集合。

这个小测试案例说明了我的意思:

public class OriginEntityTest4 {

    [..]    

    @Test
    public void test() throws Exception {
    final OriginEntity oe = new OriginEntity("o");
    final ReferencePeakEntity rpe = new ReferencePeakEntity();
    oe.getReferencePeaks().add(rpe);
    DatabaseAccess.onEntityManager(em -> {
        em.persist(oe);
        em.persist(rpe);
    });
    System.out.println(rpe.getEntityId());
    DatabaseAccess.onEntityManager(em -> {
        em.find(OriginEntity.class, oe.getEntityId());
    });

    }

}

@Access(AccessType.PROPERTY)
@Entity(name = "Origin")
public class OriginEntity extends NamedEntity {

    [..]

    private final ListProperty<ReferencePeakEntity> referencePeaks =
    referencePeaks =
    new SimpleListProperty<>(FXCollections.observableArrayList(ReferencePeakEntity.extractor()));

    @Override
    @OneToMany(mappedBy = "origin", fetch = FetchType.LAZY)
    public final List<ReferencePeakEntity> getReferencePeaks() {
    return this.referencePeaksProperty().get();
    }

    public final void setReferencePeaks(final List<ReferencePeakEntity> referencePeaks) {
    this.referencePeaksProperty().setAll(referencePeaks);
    }

}

我找不到任何相关文档,我的问题基本上是如何防止EntityManager加载延迟集合?

为什么我需要em.find()

我使用以下方法来决定是否需要持久保存新实体或更新现有实体。

public static void mergeOrPersistWithinTransaction(final EntityManager em, final XIdentEntity entity) {

    final XIdentEntity dbEntity = em.find(XIdentEntity.class, entity.getEntityId());
    if (dbEntity == null) {
        em.persist(entity);
    } else {
        em.merge(entity);
    }
    }

请注意OriginEntity是一个JavaFX bean,其中getter和setter委托给ListProperty

2 个答案:

答案 0 :(得分:1)

因为FetchType.LAZY只是一个提示。根据实施情况以及您如何配置实体,它能够做到与否。

答案 1 :(得分:1)

不是问题的答案问题,但可能是你的问题。

在这种情况下,您也可以使用em.getReference(entityClass, primaryKey)。在您的情况下它应该更有效,因为它只是获得对可能存在的实体的引用。

请参阅When to use EntityManager.find() vs EntityManager.getReference()

另一方面,我认为您的支票可能不需要。你可以坚持或合并没有检查?

请参阅JPA EntityManager: Why use persist() over merge()?