使用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
。
答案 0 :(得分:1)
因为FetchType.LAZY只是一个提示。根据实施情况以及您如何配置实体,它能够做到与否。
答案 1 :(得分:1)
不是问题的答案问题,但可能是你的问题。
在这种情况下,您也可以使用em.getReference(entityClass, primaryKey)
。在您的情况下它应该更有效,因为它只是获得对可能存在的实体的引用。
请参阅When to use EntityManager.find() vs EntityManager.getReference()
另一方面,我认为您的支票可能不需要。你可以坚持或合并没有检查?