Author: jgrassel Date: Thu Feb 1 21:57:06 2018 New Revision: 1822909 URL: http://svn.apache.org/viewvc?rev=1822909&view=rev Log: OPENJPA-2726: Under certain conditions an Embeddable can be directly admitted into the Datacache map
Added: openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/TestDataCache.java (with props) openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/EmbeddableData.java (with props) openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/LeftHand.java (with props) openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/RightHand.java (with props) Modified: openjpa/branches/2.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java Modified: openjpa/branches/2.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java URL: http://svn.apache.org/viewvc/openjpa/branches/2.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java?rev=1822909&r1=1822908&r2=1822909&view=diff ============================================================================== --- openjpa/branches/2.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java (original) +++ openjpa/branches/2.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java Thu Feb 1 21:57:06 2018 @@ -423,6 +423,14 @@ public class DataCacheStoreManager data = newPCData(sm, cache); } data.store(sm); + + // Check if data has no id, if it does not, do not enter it into the cache, as we do + // not want to introduce any null-key entries into the cache map (some cache + // implementations cannot handle that) + if (data.getId() == null) { + return; + } + if (isNew) { cache.put(data); } else { @@ -487,6 +495,9 @@ public class DataCacheStoreManager DataCachePCData data = cache.get(sm.getObjectId()); boolean alreadyCached = data != null; + if (alreadyCached == false && sm.isEmbedded()) { + return; + } if ((fetch.getCacheStoreMode() == DataCacheStoreMode.USE && !alreadyCached) || fetch.getCacheStoreMode() == DataCacheStoreMode.REFRESH) { Added: openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/TestDataCache.java URL: http://svn.apache.org/viewvc/openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/TestDataCache.java?rev=1822909&view=auto ============================================================================== --- openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/TestDataCache.java (added) +++ openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/TestDataCache.java Thu Feb 1 21:57:06 2018 @@ -0,0 +1,129 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.openjpa.persistence.cache.jpa; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.Query; + +import org.apache.openjpa.datacache.ConcurrentDataCache; +import org.apache.openjpa.datacache.DataCache; +import org.apache.openjpa.datacache.DataCachePCDataImpl; +import org.apache.openjpa.persistence.OpenJPAEntityManager; +import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory; +import org.apache.openjpa.persistence.StoreCache; +import org.apache.openjpa.persistence.StoreCacheImpl; +import org.apache.openjpa.persistence.cache.jpa.model.EmbeddableData; +import org.apache.openjpa.persistence.cache.jpa.model.LeftHand; +import org.apache.openjpa.persistence.cache.jpa.model.RightHand; +import org.apache.openjpa.persistence.test.SingleEMFTestCase; +import org.apache.openjpa.util.CacheMap; + +public class TestDataCache extends SingleEMFTestCase { + public void setUp() { + super.setUp(CLEAR_TABLES, + "openjpa.DataCache","true", + LeftHand.class, + RightHand.class, + EmbeddableData.class); + emf.createEntityManager(); + } + + public void testNoRawEmbeddableStoreInDatacache() { + final EntityManager em = emf.createEntityManager(); + final OpenJPAEntityManager oem = em.unwrap(OpenJPAEntityManager.class); + final OpenJPAEntityManagerFactory oemf = oem.getEntityManagerFactory(); + final StoreCacheImpl sc = (StoreCacheImpl) oemf.getStoreCache(); + final DataCache dc = sc.getDelegate(); + final ConcurrentDataCache cdc = (ConcurrentDataCache) dc; + + + final LeftHand lh = new LeftHand(); + lh.setId(System.currentTimeMillis()); + lh.setStrData("left hand"); + + final RightHand rh = new RightHand(); + rh.setId(System.currentTimeMillis()); + rh.setStrData("right hand"); + + final EmbeddableData ed = new EmbeddableData(); + ed.setEmbeddedString("Embedded String"); + ed.setLazyEmbeddedString("Lazy String"); + rh.setEmb(ed); + + final ArrayList<RightHand> rhList = new ArrayList<RightHand>(); + rhList.add(rh); + lh.setRhList(rhList); + + em.getTransaction().begin(); + em.persist(lh); + em.persist(rh); + em.getTransaction().commit(); + + CacheMap cm = cdc.getCacheMap(); + validateCache(cm); + + em.clear(); + oemf.getCache().evictAll(); + assertEquals(0, cm.size()); + + Query q = em.createQuery("SELECT lh FROM LeftHand lh"); + List resultList = q.getResultList(); + for (Object o : resultList) { + System.out.println(o); + } + + validateCache(cm); + } + + private void validateCache(CacheMap cm) { + assertNotNull(cm); + + final Collection afterCommitCacheEntries = cm.values(); + assertNotNull(afterCommitCacheEntries); + + // Expecting 1 entry for LeftHand, and 1 entry for righthand + boolean foundLeft = false; + boolean foundRight = false; + Iterator<?> i1 = afterCommitCacheEntries.iterator(); + while (i1.hasNext()) { + DataCachePCDataImpl o = (DataCachePCDataImpl) i1.next(); + assertNotNull(o); + Class<?> type = o.getType(); + if (LeftHand.class.equals(type)) { + foundLeft = true; + } else if (RightHand.class.equals(type)) { + foundRight = true; + } else if (EmbeddableData.class.equals(type)) { + // Found raw Embeddable in the datacache + fail(); + } + } + + assertTrue(foundLeft); + assertTrue(foundRight); + + assertEquals(2, cm.size()); + } +} Propchange: openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/TestDataCache.java ------------------------------------------------------------------------------ svn:eol-style = native Added: openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/EmbeddableData.java URL: http://svn.apache.org/viewvc/openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/EmbeddableData.java?rev=1822909&view=auto ============================================================================== --- openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/EmbeddableData.java (added) +++ openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/EmbeddableData.java Thu Feb 1 21:57:06 2018 @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.openjpa.persistence.cache.jpa.model; + +import javax.persistence.Basic; +import javax.persistence.Embeddable; +import javax.persistence.FetchType; + +@Embeddable +public class EmbeddableData { + @Basic + private String embeddedString; + + @Basic(fetch=FetchType.LAZY) + private String lazyEmbeddedString; + + public EmbeddableData() { + + } + + public String getEmbeddedString() { + return embeddedString; + } + + public void setEmbeddedString(String embeddedString) { + this.embeddedString = embeddedString; + } + + public String getLazyEmbeddedString() { + return lazyEmbeddedString; + } + + public void setLazyEmbeddedString(String lazyEmbeddedString) { + this.lazyEmbeddedString = lazyEmbeddedString; + } + + @Override + public String toString() { + return "EmbeddableData [embeddedString=" + embeddedString + "]"; + } +} Propchange: openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/EmbeddableData.java ------------------------------------------------------------------------------ svn:eol-style = native Added: openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/LeftHand.java URL: http://svn.apache.org/viewvc/openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/LeftHand.java?rev=1822909&view=auto ============================================================================== --- openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/LeftHand.java (added) +++ openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/LeftHand.java Thu Feb 1 21:57:06 2018 @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.openjpa.persistence.cache.jpa.model; + +import java.util.Collection; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Version; + +@Entity +public class LeftHand { + @Id + private long id; + + private String strData; + + @OneToMany + private Collection<RightHand> rhList; + + @Version + private long version; + + public LeftHand() { + + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getStrData() { + return strData; + } + + public void setStrData(String strData) { + this.strData = strData; + } + + public Collection<RightHand> getRhList() { + return rhList; + } + + public void setRhList(Collection<RightHand> rhList) { + this.rhList = rhList; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } + + @Override + public String toString() { + return "LeftHand [id=" + id + ", strData=" + strData + ", rhList=" + rhList + ", version=" + version + "]"; + } +} Propchange: openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/LeftHand.java ------------------------------------------------------------------------------ svn:eol-style = native Added: openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/RightHand.java URL: http://svn.apache.org/viewvc/openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/RightHand.java?rev=1822909&view=auto ============================================================================== --- openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/RightHand.java (added) +++ openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/RightHand.java Thu Feb 1 21:57:06 2018 @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.openjpa.persistence.cache.jpa.model; + +import javax.persistence.Basic; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class RightHand { + @Id + private long id; + + @Basic + private String strData; + + @Embedded + private EmbeddableData emb; + + public RightHand() { + + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getStrData() { + return strData; + } + + public void setStrData(String strData) { + this.strData = strData; + } + + public EmbeddableData getEmb() { + return emb; + } + + public void setEmb(EmbeddableData emb) { + this.emb = emb; + } + + @Override + public String toString() { + return "RightHand [id=" + id + ", strData=" + strData + ", emb=" + emb + "]"; + } +} Propchange: openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/cache/jpa/model/RightHand.java ------------------------------------------------------------------------------ svn:eol-style = native