001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */
019: package org.apache.openjpa.persistence.jdbc.annotations;
020:
021: import java.sql.Types;
022: import javax.persistence.EntityManager;
023:
024: import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
025: import org.apache.openjpa.jdbc.meta.ClassMapping;
026: import org.apache.openjpa.jdbc.meta.FieldMapping;
027: import org.apache.openjpa.jdbc.meta.strats.ClobValueHandler;
028: import org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedClobFieldStrategy;
029: import org.apache.openjpa.jdbc.meta.strats.StringFieldStrategy;
030: import org.apache.openjpa.jdbc.sql.DBDictionary;
031: import org.apache.openjpa.persistence.test.SingleEMFTestCase;
032: import org.apache.openjpa.persistence.JPAFacadeHelper;
033: import org.apache.openjpa.meta.ClassMetaData;
034: import org.apache.openjpa.meta.FieldMetaData;
035:
036: /**
037: * Test for embedded
038: *
039: * @author Steve Kim
040: */
041: public class TestEJBEmbedded extends SingleEMFTestCase {
042:
043: private static final String CLOB;
044:
045: static {
046: StringBuffer buf = new StringBuffer();
047: for (int i = 0; i < 1000; i++)
048: buf.append('a');
049: CLOB = buf.toString();
050: }
051:
052: public void setUp() {
053: setUp(EmbedOwner.class, EmbedValue.class, CLEAR_TABLES);
054: }
055:
056: public void testEmbedded() {
057: EntityManager em = emf.createEntityManager();
058: em.getTransaction().begin();
059: EmbedOwner owner = new EmbedOwner();
060: owner.setBasic("foo");
061: EmbedValue embed = new EmbedValue();
062: embed.setClob(CLOB);
063: embed.setBasic("bar");
064: embed.setBlob("foobar".getBytes());
065: embed.setOwner(owner);
066: owner.setEmbed(embed);
067: em.persist(owner);
068: int pk = owner.getPk();
069: em.getTransaction().commit();
070: em.close();
071:
072: em = emf.createEntityManager();
073: owner = em.find(EmbedOwner.class, pk);
074: assertEquals("foo", owner.getBasic());
075: embed = owner.getEmbed();
076: assertNotNull(embed);
077: assertEquals(CLOB, embed.getClob());
078: assertEquals("bar", embed.getBasic());
079: assertEquals("foobar", new String(embed.getBlob()));
080: assertEquals(owner, embed.getOwner());
081: em.close();
082: }
083:
084: public void testEmbeddedMetaData() {
085: ClassMetaData ownerMeta = JPAFacadeHelper.getMetaData(emf,
086: EmbedOwner.class);
087: FieldMetaData fmd = ownerMeta.getField("embed");
088: ClassMetaData embeddedMeta = fmd.getDefiningMetaData();
089: assertNotNull(embeddedMeta);
090: assertNull(embeddedMeta.getField("transientField"));
091: }
092:
093: public void testNull() {
094: EntityManager em = emf.createEntityManager();
095: em.getTransaction().begin();
096: EmbedOwner owner = new EmbedOwner();
097: owner.setBasic("foo");
098: em.persist(owner);
099: int pk = owner.getPk();
100: em.getTransaction().commit();
101: em.close();
102:
103: em = emf.createEntityManager();
104: owner = em.find(EmbedOwner.class, pk);
105: assertEquals("foo", owner.getBasic());
106: EmbedValue embed = owner.getEmbed();
107: assertNotNull(embed);
108: assertNull(embed.getClob());
109: assertNull(embed.getBasic());
110: assertNull(embed.getBlob());
111: em.close();
112: }
113:
114: public void testMappingTransferAndOverride() {
115: JDBCConfiguration conf = (JDBCConfiguration) emf
116: .getConfiguration();
117: ClassMapping cls = conf.getMappingRepositoryInstance()
118: .getMapping(EmbedOwner.class, null, true);
119: assertEquals("OWN_BASIC", cls.getFieldMapping("basic")
120: .getColumns()[0].getName());
121: ClassMapping embed = cls.getFieldMapping("embed")
122: .getEmbeddedMapping();
123: assertEquals("EMB_BLOB", embed.getFieldMapping("blob")
124: .getColumns()[0].getName());
125: assertEquals("OVER_BASIC", embed.getFieldMapping("basic")
126: .getColumns()[0].getName());
127: assertEquals("OVER_OWNER", embed.getFieldMapping("owner")
128: .getColumns()[0].getName());
129:
130: FieldMapping fm = embed.getFieldMapping("clob");
131: DBDictionary dict = conf.getDBDictionaryInstance();
132: if (dict.getPreferredType(Types.CLOB) == Types.CLOB) {
133: if (dict.maxEmbeddedClobSize > 0)
134: assertTrue(fm.getStrategy() instanceof MaxEmbeddedClobFieldStrategy);
135: else
136: assertTrue(fm.getHandler() instanceof ClobValueHandler);
137: } else
138: assertTrue(fm.getStrategy() instanceof StringFieldStrategy);
139: }
140: }
|