| /* |
| * 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.annotations; |
| |
| import java.sql.Types; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| import javax.persistence.EntityManager; |
| |
| import org.apache.openjpa.jdbc.conf.JDBCConfiguration; |
| import org.apache.openjpa.jdbc.meta.ClassMapping; |
| import org.apache.openjpa.jdbc.meta.FieldMapping; |
| import org.apache.openjpa.jdbc.meta.strats.ClobValueHandler; |
| import org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedClobFieldStrategy; |
| import org.apache.openjpa.jdbc.meta.strats.StringFieldStrategy; |
| import org.apache.openjpa.jdbc.sql.DBDictionary; |
| import org.apache.openjpa.meta.ClassMetaData; |
| import org.apache.openjpa.meta.FieldMetaData; |
| import org.apache.openjpa.persistence.JPAFacadeHelper; |
| import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI; |
| import org.apache.openjpa.persistence.test.SingleEMFTestCase; |
| |
| /** |
| * Test for embedded |
| * |
| * @author Steve Kim |
| */ |
| public class TestEJBEmbedded extends SingleEMFTestCase { |
| |
| private static final String CLOB; |
| |
| static { |
| StringBuffer buf = new StringBuffer(); |
| for (int i = 0; i < 1000; i++) |
| buf.append('a'); |
| CLOB = buf.toString(); |
| } |
| |
| public void setUp() { |
| setUp(EmbedOwner.class, EmbedValue.class, CLEAR_TABLES |
| // ,"openjpa.Log","SQL=trace" |
| ); |
| } |
| |
| public void testEmbedded() { |
| |
| EntityManager em = emf.createEntityManager(); |
| em.getTransaction().begin(); |
| EmbedOwner owner = new EmbedOwner(); |
| owner.setBasic("foo"); |
| EmbedValue embed = new EmbedValue(); |
| embed.setClob(CLOB); |
| embed.setBasic("bar"); |
| embed.setBlob("foobar".getBytes()); |
| embed.setOwner(owner); |
| owner.setEmbed(embed); |
| Set<EmbedValue> embedVals = new HashSet<EmbedValue>(); |
| embedVals.add(embed); |
| owner.setEmbedCollection(embedVals); |
| em.persist(owner); |
| int pk = owner.getPk(); |
| em.getTransaction().commit(); |
| em.close(); |
| |
| em = emf.createEntityManager(); |
| owner = em.find(EmbedOwner.class, pk); |
| assertEquals("foo", owner.getBasic()); |
| embed = owner.getEmbed(); |
| assertNotNull(embed); |
| assertEquals(CLOB, embed.getClob()); |
| assertEquals("bar", embed.getBasic()); |
| assertEquals("foobar", new String(embed.getBlob())); |
| assertEquals(owner, embed.getOwner()); |
| em.close(); |
| } |
| |
| public void testEmbeddedMetaData() { |
| ClassMetaData ownerMeta = |
| JPAFacadeHelper.getMetaData(emf, EmbedOwner.class); |
| FieldMetaData fmd = ownerMeta.getField("embed"); |
| ClassMetaData embeddedMeta = fmd.getDefiningMetaData(); |
| assertNotNull(embeddedMeta); |
| assertNull(embeddedMeta.getField("transientField")); |
| } |
| |
| private void nullTestLogic(boolean cache) { |
| // A place holder to swap the existing emf back in... maybe unnecessary? |
| OpenJPAEntityManagerFactorySPI tempEmf = null; |
| if (cache) { |
| tempEmf = emf; |
| emf = createEMF("openjpa.DataCache", "true"); |
| } |
| try { |
| EntityManager em = emf.createEntityManager(); |
| em.getTransaction().begin(); |
| |
| EmbedOwner owner = new EmbedOwner(); |
| owner.setBasic("foo"); |
| |
| assertNull(owner.getEmbed()); |
| assertNull(owner.getEmbedCollection()); |
| em.persist(owner); |
| assertNull(owner.getEmbed()); |
| assertNull(owner.getEmbedCollection()); |
| |
| int pk = owner.getPk(); |
| em.getTransaction().commit(); |
| assertNull(owner.getEmbed()); |
| assertNull(owner.getEmbedCollection()); |
| em.close(); |
| assertNull(owner.getEmbed()); |
| assertNull(owner.getEmbedCollection()); |
| |
| em = emf.createEntityManager(); |
| owner = em.find(EmbedOwner.class, pk); |
| assertEquals("foo", owner.getBasic()); |
| EmbedValue embed = owner.getEmbed(); |
| assertNotNull(embed); |
| assertNull(embed.getClob()); |
| assertNull(embed.getBasic()); |
| assertNull(embed.getBlob()); |
| |
| Set<EmbedValue> embedCollection = owner.getEmbedCollection(); |
| assertNotNull(embedCollection); |
| assertEquals(0, embedCollection.size()); |
| em.close(); |
| } finally { |
| if(tempEmf!=null){ |
| emf.close(); |
| emf = tempEmf; |
| } |
| } |
| } |
| public void testNullNoCache() { |
| nullTestLogic(false); |
| } |
| public void testNullCacheEnabled() { |
| nullTestLogic(true); |
| } |
| |
| public void testMappingTransferAndOverride() { |
| JDBCConfiguration conf = (JDBCConfiguration) emf.getConfiguration(); |
| ClassMapping cls = conf.getMappingRepositoryInstance().getMapping |
| (EmbedOwner.class, null, true); |
| assertEquals("OWN_BASIC", cls.getFieldMapping("basic"). |
| getColumns()[0].getName()); |
| ClassMapping embed = cls.getFieldMapping("embed").getEmbeddedMapping(); |
| assertEquals("EMB_BLOB", embed.getFieldMapping("blob"). |
| getColumns()[0].getName()); |
| assertEquals("OVER_BASIC", embed.getFieldMapping("basic"). |
| getColumns()[0].getName()); |
| assertEquals("OVER_OWNER", embed.getFieldMapping("owner"). |
| getColumns()[0].getName()); |
| |
| FieldMapping fm = embed.getFieldMapping("clob"); |
| DBDictionary dict = conf.getDBDictionaryInstance(); |
| if (dict.getPreferredType(Types.CLOB) == Types.CLOB) { |
| if (dict.maxEmbeddedClobSize > 0) |
| assertTrue(fm.getStrategy() instanceof |
| MaxEmbeddedClobFieldStrategy); |
| else |
| assertTrue(fm.getHandler() instanceof ClobValueHandler); |
| } else |
| assertTrue(fm.getStrategy() instanceof StringFieldStrategy); |
| } |
| } |