You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Jody Grassel (JIRA)" <ji...@apache.org> on 2009/10/01 17:55:23 UTC
[jira] Updated: (OPENJPA-589) Can not retrieve M-to-M data when
DataCache is on
[ https://issues.apache.org/jira/browse/OPENJPA-589?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jody Grassel updated OPENJPA-589:
---------------------------------
Attachment: OpenJPA_1.0.x_OJ589.patch
OpenJPA 1.0.x version patch for this JIRA issue
> 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.1.0, 1.2.0
>
> Attachments: openjpa.patch, openjpa.patch, openjpa.patch, OpenJPA_1.0.x_OJ589.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.