Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 为什么惰性集合不能与JavaFX getter/setter一起使用?_Jpa_Javafx_Eclipselink_Lazy Loading - Fatal编程技术网

Jpa 为什么惰性集合不能与JavaFX getter/setter一起使用?

Jpa 为什么惰性集合不能与JavaFX getter/setter一起使用?,jpa,javafx,eclipselink,lazy-loading,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");

使用
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);
    }

}

请注意,
OriginEntity
是一个JavaFXbean,其中getter和setter委托给一个
ListProperty
,因为FetchType.LAZY只是一个提示。取决于实现和实体的配置方式,它是否能够执行此操作。

因为FetchType.LAZY只是一个提示。取决于实现和您如何配置您的实体,它将能够执行或不执行。

不是标题问题的答案,而是您的问题的答案

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

另一方面,我想也许不需要你的支票。你可以不检查就坚持或合并吗


请参见

不是标题问题的答案,而是您的问题的答案

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

另一方面,我想也许不需要你的支票。你可以不检查就坚持或合并吗


请看

可能只是合并,我不确定。Persist将始终向db写入一个新条目。@kerner1000执行一些基准测试并告诉我结果:)可能只是合并,我不确定。Persist将始终向db写入一个新条目。@kerner1000执行一些基准测试并告诉我结果:)您的Set方法对惰性字段不起作用,因为它需要遍历并获取集合,才能将其作为此.referencePeaksProperty().setAll(referencePeaks)方法的一部分添加。你为什么不把它存储在本地作为一个列表呢?非常感谢!这就是问题所在。我更新了问题。显然,调用
ListProperty.setAll()
将迭代所有元素。Set方法不能很好地处理惰性字段,因为它需要遍历并获取集合,才能将其作为.referencepeasproperty().setAll(referencePeaks)方法的一部分添加。你为什么不把它存储在本地作为一个列表呢?非常感谢!这就是问题所在。我更新了问题。显然,调用
ListProperty.setAll()
将迭代所有元素。
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);
    }
    }