package rbccm.felix.objectdb.test.play; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.persistence.CascadeType; import javax.persistence.Embeddable; import javax.persistence.Entity; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.FetchType; import javax.persistence.ManyToMany; import javax.persistence.OneToOne; import javax.persistence.Persistence; import javax.persistence.Query; import org.junit.Test; public class EagerLoadIssue { @Test public void testEagerLoad() { try { EntityManagerFactory emf = Persistence.createEntityManagerFactory("$objectdb/db/testEagerLoad.odb"); EntityManager em = emf.createEntityManager(); Entity3 e3 = new Entity3("e3"); Entity2 e2 = new Entity2("e2", e3); Entity1 e1 = new Entity1("e1", e2); em.getTransaction().begin(); em.persist(e1); em.getTransaction().commit(); Query query = em.createQuery("SELECT e FROM Entity1 e WHERE e.name = :name"); query.setParameter("name", "e1"); List resultList = query.getResultList(); em.close(); Entity1 se1 = (Entity1)resultList.get(0); for(Entry entry : se1.getEntity2().getEntity3().getMetadata().entrySet()) System.out.println(String.format("%s - %s", entry.getKey(), entry.getValue())); System.out.println(""); emf.close(); } catch(Exception e) { e.printStackTrace(); } } @Entity public static final class Entity1 { private String name; @OneToOne(orphanRemoval=true, cascade=CascadeType.ALL, fetch=FetchType.EAGER) private Entity2 entity2; public Entity1(String name, Entity2 entity2) { this.name = name; this.entity2 = entity2; } public Entity2 getEntity2() { return entity2; } } @Entity public static final class Entity2 { private String name; @OneToOne(orphanRemoval=true, cascade=CascadeType.ALL, fetch=FetchType.EAGER) private Entity3 entity3; public Entity2(String name, Entity3 entity3) { this.name = name; this.entity3 = entity3; } public Entity3 getEntity3() { return entity3; } } @Embeddable public static final class Entity3 { private String name; @ManyToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL) private Map metadata; public Entity3(String name) { this.name = name; this.metadata = new HashMap(); this.metadata.put("k1", "v1"); this.metadata.put("k2", "v2"); this.metadata.put("k3", "v3"); } public Map getMetadata() { return metadata; } } }