package rbccm.felix.objectdb.test.play; import java.util.HashMap; 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.Id; import javax.persistence.ManyToMany; import javax.persistence.OneToOne; import javax.persistence.Persistence; import org.junit.Test; public class EagerLoadIssue { @Test public void testEagerLoad() { try { EntityManagerFactory emf = Persistence.createEntityManagerFactory("$objectdb/db/testEagerLoad.odb"); EntityManager em = emf.createEntityManager(); MiniWorkflowDefinition e3 = new MiniWorkflowDefinition("e3"); MiniWorkflowInstance e2 = new MiniWorkflowInstance("e2", e3); MiniExecutionGraph e1 = new MiniExecutionGraph("id1", "e1", e2); em.getTransaction().begin(); em.persist(e1); em.getTransaction().commit(); em.close(); e1 = null; e2 = null; e3 = null; em = emf.createEntityManager(); MiniExecutionGraph loadedgraph = em.find(MiniExecutionGraph.class, "id1"); // Uncomment to force load //for(Entry entry : loadedgraph.getWorkflowInstance().getWorkflowDefinition().getMetadata().entrySet()) // {} em.close(); for(Entry entry : loadedgraph.getWorkflowInstance().getWorkflowDefinition().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 MiniExecutionGraph { @Id private String id; private String name; @OneToOne(orphanRemoval=true, cascade=CascadeType.ALL, fetch=FetchType.EAGER) private MiniWorkflowInstance workflowInstance; public MiniExecutionGraph(String id, String name, MiniWorkflowInstance workflowInstance) { this.id = id; this.name = name; this.workflowInstance = workflowInstance; } public MiniWorkflowInstance getWorkflowInstance() { return workflowInstance; } } @Entity public static final class MiniWorkflowInstance { private String name; @OneToOne(orphanRemoval=true, cascade=CascadeType.ALL, fetch=FetchType.EAGER) private MiniWorkflowDefinition workflowDefinition; public MiniWorkflowInstance(String name, MiniWorkflowDefinition workflowDefinition) { this.name = name; this.workflowDefinition = workflowDefinition; } public MiniWorkflowDefinition getWorkflowDefinition() { return workflowDefinition; } } @Embeddable public static final class MiniWorkflowDefinition { private String name; @ManyToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL) private Map metadata; public MiniWorkflowDefinition(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; } } }