I experienced poor performance when using em.find(entity, primaryKey).
The reason seems to be that em.find() will also load entity collections, that are annotated with FetchType.LAZY.
This small test case illustrates what I mean:
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);
    }
}
I cannot find any documentation on that, my question is basically how can I prevent the EntityManager from loading the lazy collection?
Why I need em.find()?
I use the following method to decide whether I need to persist a new entity or update an existing one.
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);
    }
    }
Note that OriginEntity is a JavaFX bean, where getter and setter delegate to a ListProperty.
 
     
    