/* * Copyright 2004-2015 the Seasar Foundation and the Others. * * Licensed 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.seasar.extension.jdbc.meta; import java.util.List; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import junit.framework.TestCase; import org.seasar.extension.jdbc.EntityMeta; import org.seasar.extension.jdbc.JoinColumnMeta; import org.seasar.extension.jdbc.PropertyMeta; import org.seasar.extension.jdbc.entity.Aaa; import org.seasar.extension.jdbc.entity.Ggg; import org.seasar.extension.jdbc.entity.Hhh; import org.seasar.extension.jdbc.entity.Jjj; import org.seasar.extension.jdbc.entity.Kkk; import org.seasar.extension.jdbc.exception.FieldDuplicatedRuntimeException; import org.seasar.extension.jdbc.exception.JoinColumnAutoConfigurationRuntimeException; import org.seasar.extension.jdbc.exception.JoinColumnNotFoundRuntimeException; import org.seasar.extension.jdbc.exception.ManyToOneFKNotFoundRuntimeException; import org.seasar.extension.jdbc.exception.MappedByNotIdenticalRuntimeException; import org.seasar.extension.jdbc.exception.MappedByPropertyNotFoundRuntimeException; import org.seasar.extension.jdbc.exception.NonEntityRuntimeException; import org.seasar.extension.jdbc.exception.OneToOneFKNotFoundRuntimeException; import org.seasar.extension.jdbc.exception.ReferencedColumnNameNotFoundRuntimeException; import org.seasar.extension.jdbc.exception.UnsupportedInheritanceRuntimeException; import org.seasar.framework.convention.impl.PersistenceConventionImpl; import org.seasar.framework.util.DisposableUtil; /** * @author higa * */ public class EntityMetaFactoryImplTest extends TestCase { private EntityMetaFactoryImpl factory; @Override protected void setUp() { PersistenceConventionImpl convention = new PersistenceConventionImpl(); factory = new EntityMetaFactoryImpl(); factory.setPersistenceConvention(convention); TableMetaFactoryImpl tableMetaFactory = new TableMetaFactoryImpl(); tableMetaFactory.setPersistenceConvention(convention); factory.setTableMetaFactory(tableMetaFactory); PropertyMetaFactoryImpl pFactory = new PropertyMetaFactoryImpl(); pFactory.setPersistenceConvention(convention); ColumnMetaFactoryImpl cmFactory = new ColumnMetaFactoryImpl(); cmFactory.setPersistenceConvention(convention); pFactory.setColumnMetaFactory(cmFactory); factory.setPropertyMetaFactory(pFactory); factory.initialize(); } @Override protected void tearDown() throws Exception { DisposableUtil.dispose(); } /** * @throws Exception */ public void testGetEntityMeta() throws Exception { EntityMeta entityMeta = factory.getEntityMeta(Aaa.class); assertSame(entityMeta, factory.getEntityMeta(Aaa.class)); } /** * @throws Exception */ public void testGetEntityMeta_nonEntity() throws Exception { try { factory.getEntityMeta(getClass()); fail(); } catch (NonEntityRuntimeException e) { System.out.println(e); assertEquals(getClass(), e.getTargetClass()); } } /** * @throws Exception */ public void testCreateEntityMeta_entityClass() throws Exception { EntityMeta entityMeta = factory.createEntityMeta(Aaa.class); assertEquals(Aaa.class, entityMeta.getEntityClass()); } /** * @throws Exception */ public void testCreateEntityMeta_name() throws Exception { EntityMeta entityMeta = factory.createEntityMeta(Aaa.class); assertEquals("Aaa", entityMeta.getName()); } /** * @throws Exception */ public void testCreateEntityMeta_customizeName() throws Exception { EntityMeta entityMeta = factory.createEntityMeta(Hoge.class); assertEquals("Hoge2", entityMeta.getName()); } /** * @throws Exception */ public void testCreateEntityMeta_tableMeta() throws Exception { EntityMeta entityMeta = factory.createEntityMeta(Aaa.class); assertNotNull(entityMeta.getTableMeta()); } /** * @throws Exception */ public void testCreateEntityMeta_propertyMeta() throws Exception { EntityMeta entityMeta = factory.createEntityMeta(Aaa.class); assertTrue(entityMeta.getPropertyMetaSize() > 0); } /** * @throws Exception */ public void testCreateEntityMeta_noEntity() throws Exception { try { factory.createEntityMeta(getClass()); fail(); } catch (NonEntityRuntimeException e) { System.out.println(e); assertEquals(getClass(), e.getTargetClass()); } } /** * @throws Exception */ public void testCreateEntityMeta_inheritMappedSuperclass() throws Exception { EntityMeta entityMeta = factory.createEntityMeta(Hhh.class); assertEquals(3, entityMeta.getPropertyMetaSize()); assertEquals("name", entityMeta.getPropertyMeta(0).getName()); assertEquals("id", entityMeta.getPropertyMeta(1).getName()); assertEquals("iiis", entityMeta.getPropertyMeta(2).getName()); } /** * @throws Exception */ public void testCreateEntityMeta_inheritEntity() throws Exception { try { factory.createEntityMeta(Jjj.class); fail(); } catch (UnsupportedInheritanceRuntimeException e) { System.out.println(e); assertEquals(Jjj.class, e.getEntityClass()); } } /** * @throws Exception */ public void testCreateEntityMeta_fieldDuplicated() throws Exception { try { factory.createEntityMeta(Kkk.class); fail(); } catch (FieldDuplicatedRuntimeException e) { System.out.println(e); assertEquals(Ggg.class.getField("id"), e.getField()); } } /** * @throws Exception */ public void testCheckMappedBy_oneToOne_mappedByPropertyNotFound() throws Exception { try { factory.getEntityMeta(OneToOnePropertyNotFound.class); fail(); } catch (MappedByPropertyNotFoundRuntimeException e) { System.out.println(e); assertEquals("EntityMetaFactoryImplTest$OneToOnePropertyNotFound", e.getEntityName()); assertEquals("bar", e.getPropertyName()); assertEquals("xxx", e.getMappedBy()); assertEquals(BadCcc.class, e.getInverseRelationshipClass()); } } /** * @throws Exception */ public void testCheckMappedBy_oneToOne_mappedByNotIdentical() throws Exception { try { factory.getEntityMeta(OneToOneNotIdentical.class); fail(); } catch (MappedByNotIdenticalRuntimeException e) { System.out.println(e); assertEquals("EntityMetaFactoryImplTest$OneToOneNotIdentical", e .getEntityName()); assertEquals("badAaa", e.getPropertyName()); assertEquals("badCcc", e.getMappedBy()); assertEquals(BadAaa.class, e.getInverseRelationshipClass()); assertEquals("badCcc", e.getInversePropertyName()); assertEquals(BadCcc.class, e.getInversePropertyClass()); } } /** * @throws Exception */ public void testCheckMappedBy_oneToMany_mappedByPropertyNotFound() throws Exception { try { factory.getEntityMeta(OneToManyPropertyNotFound.class); fail(); } catch (MappedByPropertyNotFoundRuntimeException e) { System.out.println(e); assertEquals("EntityMetaFactoryImplTest$OneToManyPropertyNotFound", e.getEntityName()); assertEquals("bar", e.getPropertyName()); assertEquals("xxx", e.getMappedBy()); assertEquals(BadCcc.class, e.getInverseRelationshipClass()); } } /** * @throws Exception */ public void testCheckMappedBy_oneToMany_mappedByNotIdentical() throws Exception { try { factory.getEntityMeta(OneToManyNotIdentical.class); fail(); } catch (MappedByNotIdenticalRuntimeException e) { System.out.println(e); assertEquals("EntityMetaFactoryImplTest$OneToManyNotIdentical", e .getEntityName()); assertEquals("badBbb", e.getPropertyName()); assertEquals("badCcc", e.getMappedBy()); assertEquals(BadBbb.class, e.getInverseRelationshipClass()); assertEquals("badCcc", e.getInversePropertyName()); assertEquals(BadCcc.class, e.getInversePropertyClass()); } } /** * @throws Exception */ public void testResolveJoinColumn() throws Exception { EntityMeta entityMeta = factory.getEntityMeta(Aaa.class); PropertyMeta pm = entityMeta.getPropertyMeta("bbb"); assertEquals(1, pm.getJoinColumnMetaList().size()); JoinColumnMeta jcm = pm.getJoinColumnMetaList().get(0); assertEquals("BBB_ID", jcm.getName()); assertEquals("ID", jcm.getReferencedColumnName()); } /** * @throws Exception */ public void testResolveJoinColumn_joinColumnNotFound() throws Exception { try { factory.getEntityMeta(Hoge.class); fail(); } catch (JoinColumnNotFoundRuntimeException e) { System.out.println(e); assertEquals("Hoge2", e.getEntityName()); assertEquals("foo", e.getPropertyName()); } } /** * @throws Exception */ public void testResolveJoinColumn_joinColumnAutoConfiguration() throws Exception { try { factory.getEntityMeta(Hoge3.class); fail(); } catch (JoinColumnAutoConfigurationRuntimeException e) { System.out.println(e); assertEquals("Hoge3", e.getEntityName()); assertEquals("foo", e.getPropertyName()); } } /** * @throws Exception */ public void testResolveJoinColumn_manyToOneFKNotFound() throws Exception { try { factory.getEntityMeta(Hoge4.class); fail(); } catch (ManyToOneFKNotFoundRuntimeException e) { System.out.println(e); assertEquals("Hoge4", e.getEntityName()); assertEquals("aaa", e.getPropertyName()); assertEquals("AAA_ID", e.getForeignKey()); } } /** * @throws Exception */ public void testResolveJoinColumn_oneToOneFKNotFound() throws Exception { try { factory.getEntityMeta(Hoge5.class); fail(); } catch (OneToOneFKNotFoundRuntimeException e) { System.out.println(e); assertEquals("Hoge5", e.getEntityName()); assertEquals("aaa", e.getPropertyName()); assertEquals("AAA_ID", e.getForeignKey()); } } /** * @throws Exception */ public void testResolveJoinColumn_referencedColumnNotFound() throws Exception { try { factory.getEntityMeta(Hoge6.class); fail(); } catch (ReferencedColumnNameNotFoundRuntimeException e) { System.out.println(e); assertEquals("Hoge6", e.getEntityName()); assertEquals("aaa", e.getPropertyName()); assertEquals("Aaa", e.getInverseEntityName()); assertEquals("xxx", e.getPrimaryKey()); } } /** * @throws Exception */ public void testColumnMeta_relationship() throws Exception { EntityMeta entityMeta = factory.getEntityMeta(Aaa.class); assertFalse(entityMeta.hasColumnPropertyMeta("bbb")); } @Entity(name = "Hoge2") private static class Hoge { /** * */ @OneToOne public Foo foo; /** * */ @OneToOne @JoinColumn public Foo foo2; } @Entity(name = "Hoge3") private static class Hoge3 { /** * */ @OneToOne @JoinColumn public Foo foo; } @Entity(name = "Hoge4") private static class Hoge4 { /** * */ @ManyToOne public Aaa aaa; } @Entity(name = "Hoge5") private static class Hoge5 { /** * */ @OneToOne public Aaa aaa; } @Entity(name = "Hoge6") private static class Hoge6 { /** * */ public Integer aaaId; /** * */ @OneToOne @JoinColumn(referencedColumnName = "xxx") public Aaa aaa; } @Entity private static class Foo { /** * */ @Id public Integer id; /** * */ @Id public Integer id2; } @Entity private static class OneToOnePropertyNotFound { /** * */ @Id public Integer id; /** * */ public Integer aaaId; /** * */ @OneToOne(mappedBy = "xxx") public BadCcc bar; } @Entity private static class OneToOneNotIdentical { /** * */ @Id public Integer id; /** * */ @OneToOne(mappedBy = "badCcc") public BadAaa badAaa; } @Entity private static class OneToManyPropertyNotFound { /** * */ @Id public Integer id; /** * */ @OneToMany(mappedBy = "xxx") public List<BadCcc> bar; } @Entity private static class OneToManyNotIdentical { /** * */ @Id public Integer id; /** * */ @OneToMany(mappedBy = "badCcc") public List<BadBbb> badBbb; } @Entity private static class BadAaa { /** * */ @Id public Integer id; /** * */ @OneToOne public BadCcc badCcc; } @Entity private static class BadBbb { /** * */ @Id public Integer id; /** * */ @ManyToOne public BadCcc badCcc; } @Entity private static class BadCcc { /** * */ @Id public Integer id; } }