/* * 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.jdbc.sqlcache.discrim; import javax.persistence.EntityManager; import org.apache.openjpa.jdbc.conf.JDBCConfiguration; import org.apache.openjpa.jdbc.meta.ClassMapping; import org.apache.openjpa.kernel.FetchConfiguration; import org.apache.openjpa.kernel.FinderCache; import org.apache.openjpa.persistence.test.SingleEMFTestCase; public class TestFinderCacheWithNulls extends SingleEMFTestCase { private FetchConfiguration fetchCfg; private FinderCache fndrCache; private ClassMapping clsMapping_UserData; private ClassMapping clsMapping_AbstractExtValue; @Override public void setUp() throws Exception { super.setUp(AbstractExtValue.class, ComposedPK.class, ExtValue1.class, UserData.class); } public void test() { init(); initData(); EntityManager em = this.emf.createEntityManager(); assertNull(fndrCache.get(clsMapping_UserData, fetchCfg)); UserData usrData=em.find(UserData.class, new ComposedPK(Short.valueOf("2"), null)); assertNull(usrData); //FinderCache should be empty. That is, since the previous find contained a NULL, //the cache shouldn't not contain the finder SQL. However, prior to OPENJPA-2557, //the finder cache contain the finder SQL with the NULL value. With this //JIRA, the cache should not contain the finder. assertNull(fndrCache.get(clsMapping_UserData, fetchCfg)); em.clear(); usrData=em.find(UserData.class, new ComposedPK(Short.valueOf("2"), 3)); //Prior to OPENJPA-2557, the UserData would not have been found because the previous //find with a NULL would have been cached. assertNotNull(usrData); assertNull(fndrCache.get(clsMapping_UserData, fetchCfg)); em.clear(); ExtValue1 ev1 = em.find(ExtValue1.class, "A"); assertNotNull(ev1); assertNotNull(fndrCache.get(clsMapping_AbstractExtValue, fetchCfg)); em.clear(); fndrCache.invalidate(clsMapping_AbstractExtValue); assertNull(fndrCache.get(clsMapping_AbstractExtValue, fetchCfg)); AbstractExtValue aev = em.find(AbstractExtValue.class, "A"); assertNotNull(aev); assertNotNull(fndrCache.get(clsMapping_AbstractExtValue, fetchCfg)); em.close(); } public void init(){ EntityManager em = emf.createEntityManager(); JDBCConfiguration conf = (JDBCConfiguration) emf.getConfiguration(); clsMapping_UserData = conf.getMappingRepositoryInstance().getMapping(UserData.class, null, true); clsMapping_AbstractExtValue = conf.getMappingRepositoryInstance(). getMapping(AbstractExtValue.class, null, true); fetchCfg = ((org.apache.openjpa.persistence.EntityManagerImpl) em).getBroker().getFetchConfiguration(); fndrCache = ((JDBCConfiguration) emf.getConfiguration()).getFinderCacheInstance(); em.close(); } public void initData() { EntityManager em = emf.createEntityManager(); ExtValue1 extValue1 = new ExtValue1(); extValue1.setCode("A"); em.getTransaction().begin(); em.persist(extValue1); em.flush(); ComposedPK pK = new ComposedPK((short) 2, 3); UserData userData = new UserData(); userData.setPk(pK); userData.setExtValue(extValue1); em.persist(userData); em.getTransaction().commit(); em.close(); } }