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