That's great, thank you for your time! Heno
-----Oorspronkelijk bericht----- Van: Rick Curtis [mailto:[email protected]] Verzonden: donderdag 17 februari 2011 15:36 Aan: [email protected] Onderwerp: Re: N+1 select problem for Map no matter what I try Ok, now I was able to recreate the behavior that you reported... I'll dig into this a little more and get back with you. Thanks, Rick On Thu, Feb 17, 2011 at 4:25 AM, Henno Vermeulen <[email protected]>wrote: > Thank you for your reply! I tried and it unfortunately doesn't work. I > stripped my example down to the bare minimum. I am using OpenJPA 2.0.0 > (downloaded openjpa-all using Maven). > In my real application I use compile time enhancement and mssql server, I > am running this test with hsqldb and openjpa as javaagent > (-javaagent:C:/Users/h.vermeulen/.m2/repository/org/apache/openjpa/openjpa-all/2.0.0/openjpa-all-2.0.0.jar). > > Here are my classes and settings: > > Persistence.xml: > <persistence xmlns="http://java.sun.com/xml/ns/persistence" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > > xsi:schemaLocation="http://java.sun.com/xml/ns/persistencepersistence_1_0.xsd" > version="1.0"> > > <persistence-unit name="testPU"> > > <provider>org.apache.openjpa.persistence.PersistenceProviderImpl > </provider> > <class>entities.TestEntity</class> > <exclude-unlisted-classes>true</exclude-unlisted-classes> > <properties> > <property name="openjpa.jdbc.SynchronizeMappings" > value="buildSchema" /> > <property name="openjpa.ConnectionDriverName" > value="org.hsqldb.jdbcDriver" /> > <property name="openjpa.ConnectionURL" > value="jdbc:hsqldb:mem:test" /> > <property name="openjpa.ConnectionUserName" > value="sa" /> > <property name="openjpa.ConnectionPassword" value="" > /> > <property name="openjpa.Log" > value="DefaultLevel=TRACE" /> > </properties> > </persistence-unit> > </persistence> > > TestEntity.java: > package entities; > > import java.util.HashMap; > import java.util.Map; > > import javax.persistence.CascadeType; > import javax.persistence.Entity; > import javax.persistence.FetchType; > import javax.persistence.GeneratedValue; > import javax.persistence.Id; > > import org.apache.openjpa.persistence.PersistentMap; > > @Entity > public class TestEntity { > > @Id > @GeneratedValue > private Long id; > > @PersistentMap(elementCascade = CascadeType.PERSIST, fetch = > FetchType.EAGER) > private Map<String, String> strings = new HashMap<String, > String>(); > > public TestEntity() { > } > > public Long getId() { > return id; > } > > public Map<String, String> getStrings() { > return strings; > } > > } > > MapPerformanceTest.java: > import java.util.List; > > import javax.persistence.EntityManagerFactory; > import javax.persistence.Persistence; > > import org.apache.openjpa.persistence.OpenJPAEntityManager; > > import entities.TestEntity; > > public class MapPerformanceTest { > private EntityManagerFactory factory; > > public void createEntityManagerFactory() { > factory = Persistence.createEntityManagerFactory("testPU", > System > .getProperties()); > } > > private void persistInTransaction(TestEntity item) { > OpenJPAEntityManager em = (OpenJPAEntityManager) factory > .createEntityManager(); > em.getTransaction().begin(); > em.persist(item); > em.getTransaction().commit(); > em.close(); > } > > private void createEntities() { > for (int i = 0; i < 100; i++) { > TestEntity entity = new TestEntity(); > entity.getStrings().put("a", "test " + i); > entity.getStrings().put("b", "another test " + i); > persistInTransaction(entity); > } > } > > private List<TestEntity> findAllEntities() { > OpenJPAEntityManager em = (OpenJPAEntityManager) factory > .createEntityManager(); > em.getTransaction().begin(); > String query = "SELECT z FROM " + > TestEntity.class.getSimpleName() > + " z"; > List<TestEntity> result = em.createQuery(query, > TestEntity.class) > .getResultList(); > em.getTransaction().commit(); > em.close(); > return result; > } > > public static void main(String[] args) { > MapPerformanceTest t = new MapPerformanceTest(); > t.createEntityManagerFactory(); > t.createEntities(); > System.err.println("----------- find all -----------"); > t.findAllEntities(); > } > } > > > Henno Vermeulen > > -----Oorspronkelijk bericht----- > Van: Rick Curtis [mailto:[email protected]] > Verzonden: woensdag 16 februari 2011 16:49 > Aan: [email protected] > Onderwerp: Re: N+1 select problem for Map no matter what I try > > Can you try using @PersistentMap(elementCascade = > CascadeType.PERSIST,fetch=FetchType.EAGER) rather than @ElementCollection? > I > don't see the N+1 select problem in my tests when using the persistentmap > annotation. > > Thanks, > Rick > > On Wed, Feb 16, 2011 at 8:36 AM, Henno Vermeulen <[email protected] > >wrote: > > > When I have a Map inside a TestEntity (mapped either with @OneToMany or > > @ElementCollection), OpenJPA 2 always performs N + 1 selects when I do > the > > simple query "SELECT z FROM TestEntity z". > > > > A solution to this would of course be great, but I would also be very > happy > > if an OpenJPA developer could quickly try this out and confirm to me > whether > > or not this is indeed an issue with OpenJPA or that it is simply expected > > behavior. > > > > Regards, > > Henno Vermeulen > > > > (p.s. I have tried many settings and the problem occurs no matter what I > > try. See https://issues.apache.org/jira/browse/OPENJPA-1920 and my > > unanswered post "preventing N+1 select performance problem on maps"). > > > > >
