[ https://issues.apache.org/jira/browse/OPENJPA-589?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Catalina Wei resolved OPENJPA-589. ---------------------------------- Resolution: Fixed Fix Version/s: 1.2.0 Assignee: Catalina Wei patch committed under r654658 > Can not retrieve M-to-M data when DataCache is on > ------------------------------------------------- > > Key: OPENJPA-589 > URL: https://issues.apache.org/jira/browse/OPENJPA-589 > Project: OpenJPA > Issue Type: Bug > Components: datacache > Reporter: Fay Wang > Assignee: Catalina Wei > Fix For: 1.2.0 > > Attachments: openjpa.patch > > > When DataCahe is on, the retrieval of M-to-M data will fail with the > following exception: > <openjpa-1.0.1-r420667:592145 fatal user error> > org.apache.openjpa.persistence.ArgumentException: Could not locate metadata > for the class using oid "10=10" of type "class java.util.HashMap$Entry". > Registered oid type mappings: "{class org.apache.openjpa.util.IntId=class > dw.EntityB, class java.util.HashMap$Entry=null}" > FailedObject: 10=10 [java.util.HashMap$Entry] > at > org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:986) > at > org.apache.openjpa.kernel.BrokerImpl.newStateManagerImpl(BrokerImpl.java:1121) > at org.apache.openjpa.kernel.BrokerImpl.findAll(BrokerImpl.java:913) > at org.apache.openjpa.kernel.BrokerImpl.findAll(BrokerImpl.java:862) > at > org.apache.openjpa.kernel.AbstractPCData.toRelationFields(AbstractPCData.java:214) > at > org.apache.openjpa.kernel.AbstractPCData.toNestedFields(AbstractPCData.java:181) > at > org.apache.openjpa.kernel.AbstractPCData.toField(AbstractPCData.java:95) > at org.apache.openjpa.kernel.PCDataImpl.loadField(PCDataImpl.java:197) > at org.apache.openjpa.kernel.PCDataImpl.load(PCDataImpl.java:167) > at > org.apache.openjpa.datacache.DataCacheStoreManager.load(DataCacheStoreManager.java:373) > at > org.apache.openjpa.kernel.DelegatingStoreManager.load(DelegatingStoreManager.java:116) > at > org.apache.openjpa.kernel.ROPStoreManager.load(ROPStoreManager.java:78) > at > org.apache.openjpa.kernel.StateManagerImpl.loadFields(StateManagerImpl.java:2867) > at > org.apache.openjpa.kernel.StateManagerImpl.loadField(StateManagerImpl.java:2945) > at > org.apache.openjpa.kernel.StateManagerImpl.beforeAccessField(StateManagerImpl.java:1449) > at > org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1434) > at dw.EntityE.pcGetentityf(EntityE.java) > at dw.EntityE.print(EntityE.java:32) > at dw.Test3.main(Test3.java:49) > The test case to reproduce this error is: > EntityManagerFactory emf = Persistence > .createEntityManagerFactory("Test1"); > > EntityManager em = emf.createEntityManager(); > em.getTransaction().begin(); > EntityE e1 = new EntityE(); > e1.setId(1); > e1.setName("ABC"); > em.persist(e1); > EntityE e2 = new EntityE(); > e2.setId(2); > e2.setName("DEF"); > em.persist(e2); > > EntityF f1 = new EntityF(); > f1.setId(10); > em.persist(f1); > EntityF f2 = new EntityF(); > f2.setId(20); > em.persist(f2); > > e1.getEntityF().put(f1.getId(), f1); > e1.getEntityF().put(f2.getId(), f2); > e2.getEntityF().put(f1.getId(), f1); > e2.getEntityF().put(f2.getId(), f2); > > f1.getEntityE().put(e1.getName(), e1); > f1.getEntityE().put(e2.getName(), e2); > f2.getEntityE().put(e1.getName(), e1); > f2.getEntityE().put(e2.getName(), e2); > e1.print(); > e2.print(); > f1.print(); > f2.print(); > em.getTransaction().commit(); > em.close(); > em = emf.createEntityManager(); > EntityE e1a = em.find(EntityE.class, 1); > e1a.getEntityf(); <========= > exception is thrown here > EntityE e2a = em.find(EntityE.class, 2); > e2a.getEntityf(); > EntityF f1a = em.find(EntityF.class, 10); > f1a.getEntitye(); > EntityF f2a = em.find(EntityF.class, 20); > f2a.getEntitye(); > Note that this test case created 4 entities: > EnityE: e1 (id = 1), e2 (id = 2), > EntityF: f1 (id = 10), f2 (id = 20) > EntityE has a field entityf, which is a Map<Integer, EntityF> > EntityF has a field entitye, which is a Map<String, EntityE> > In this test case, entityf of e1 contains <10, f1>, and <20, f2>. The same > for entityf of e2. On the other hand, > entitye of f1 contains<"ABC", e1>, and <"DEF", e2>. The same for entitye of > f2. > When DataCache is on, e1, e2, f1, and f2 are all stored in the data cache. > Note that for the field of entityf in e1 and e2, > the value of Map (<10, object id of f1>, <20, object id of f2> is store in > the datacache. For the field of entitye in f1 and f2, > the value of Map(<"ABC", object id of e1>, <"DEF", object id of e2> is stored > in the data cache. > The cause of the exception shown above occurs when the value of the Map is to > be retrieved from the data cache. > Specifically, it happens in AbstractPCData.toField. The keys of the Map are > correctly retrieved while the values of the > Map are handled incorrectly. The attached patch fixes this problem. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.