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