From: <hib...@li...> - 2006-03-29 08:57:37
|
Author: epbernard Date: 2006-03-29 03:56:23 -0500 (Wed, 29 Mar 2006) New Revision: 9710 Added: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/CreateKeySecondPass.java Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java Log: ANN-292 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-29 03:32:24 UTC (rev 9709) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-29 08:56:23 UTC (rev 9710) @@ -505,7 +505,7 @@ boolean onDeleteAppropriate = false; if ( InheritanceType.JOINED.equals( inheritanceState.type ) && inheritanceState.hasParents ) { onDeleteAppropriate = true; - JoinedSubclass jsc = (JoinedSubclass) persistentClass; + final JoinedSubclass jsc = (JoinedSubclass) persistentClass; if ( persistentClass.getEntityPersisterClass() == null ) { persistentClass.getRootClass().setEntityPersisterClass( JoinedSubclassEntityPersister.class ); } @@ -518,8 +518,7 @@ key.setCascadeDeleteEnabled( false ); } TableBinder.bindFk( jsc.getSuperclass(), jsc, inheritanceJoinedColumns, key, false, mappings ); - jsc.createPrimaryKey(); - jsc.createForeignKey(); + mappings.addSecondPass( new CreateKeySecondPass(jsc) ); } else if ( InheritanceType.SINGLE_TABLE.equals( inheritanceState.type ) ) { @@ -643,7 +642,7 @@ subclassAndSingleTableStrategy ? Nullability.FORCED_NULL : Nullability.NO_CONSTRAINT, propertyAnnotatedElement.getProperty(), propertyAnnotatedElement, classGenerators, entityBinder, - false, false, entityBinder.getPropertyAccessor(), mappings + false, false, mappings ); } else { @@ -664,7 +663,8 @@ } if ( ! inheritanceState.hasParents ) { - ( (RootClass) persistentClass ).createPrimaryKey(); + final RootClass rootClass = (RootClass) persistentClass; + mappings.addSecondPass( new CreateKeySecondPass(rootClass) ); } else { superEntity.addSubclass( (Subclass) persistentClass ); @@ -925,7 +925,7 @@ PropertyHolder propertyHolder, Nullability nullability, XProperty property, PropertyData inferredData, HashMap<String, IdGenerator> classGenerators, EntityBinder entityBinder, boolean isIdentifierMapper, - boolean isComponentEmbedded, String accessType, ExtendedMappings mappings + boolean isComponentEmbedded, ExtendedMappings mappings ) throws MappingException { Ejb3Column[] columns = null; @@ -1479,7 +1479,7 @@ subHolder, isNullable ? Nullability.NO_CONSTRAINT : Nullability.FORCED_NOT_NULL, propertyAnnotatedElement.getProperty(), propertyAnnotatedElement, new HashMap<String, IdGenerator>(), entityBinder, isIdentifierMapper, isComponentEmbedded, - propertyAccessor, mappings + mappings ); } return comp; @@ -1512,9 +1512,10 @@ propertyHolder, inferredData, isPropertyAnnotated, propertyAccessor, false, entityBinder, isEmbedded, isIdentifierMapper, mappings ); - ( (Component) id ).setKey( true ); - if ( ! id.getColumnIterator().hasNext() ) { - throw new AnnotationException( ( (Component) id ).getComponentClassName() + " has not persistent id property" ); + Component componentId = (Component) id; + componentId.setKey( true ); + if ( componentId.getPropertySpan() == 0 ) { + throw new AnnotationException( componentId.getComponentClassName() + " has no persistent id property" ); } } else { @@ -1541,11 +1542,12 @@ PersistentIdentifierGenerator.TABLE, table.getName() ); - Iterator idColumnIterator = id.getColumnIterator(); - params.setProperty( - PersistentIdentifierGenerator.PK, - ( (org.hibernate.mapping.Column) idColumnIterator.next() ).getName() - ); + if ( id.getColumnSpan() == 1) { + params.setProperty( + PersistentIdentifierGenerator.PK, + ( (org.hibernate.mapping.Column) id.getColumnIterator().next() ).getName() + ); + } if ( ! isDefault( generatorName ) ) { //we have a named generator IdGenerator gen = mappings.getGenerator( generatorName, localGenerators ); Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java 2006-03-29 03:32:24 UTC (rev 9709) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java 2006-03-29 08:56:23 UTC (rev 9710) @@ -240,6 +240,15 @@ iter.remove(); } } + iter = secondPasses.iterator(); + while ( iter.hasNext() ) { + SecondPass sp = (SecondPass) iter.next(); + //do the second pass of fk before the others and remove them + if ( sp instanceof CreateKeySecondPass ) { + sp.doSecondPass( classes, Collections.EMPTY_MAP ); // TODO: align meta-attributes with normal bind... + iter.remove(); + } + } inSecondPass = true; super.secondPassCompile(); inSecondPass = false; Added: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/CreateKeySecondPass.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/CreateKeySecondPass.java 2006-03-29 03:32:24 UTC (rev 9709) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/CreateKeySecondPass.java 2006-03-29 08:56:23 UTC (rev 9710) @@ -0,0 +1,37 @@ +//$Id: $ +package org.hibernate.cfg; + +import java.util.Map; + +import org.hibernate.MappingException; +import org.hibernate.mapping.RootClass; +import org.hibernate.mapping.JoinedSubclass; + +/** + * @author Emmanuel Bernard + */ +public class CreateKeySecondPass implements SecondPass { + private RootClass rootClass; + private JoinedSubclass joinedSubClass; + + public CreateKeySecondPass(RootClass rootClass) { + this.rootClass = rootClass; + } + + public CreateKeySecondPass(JoinedSubclass joinedSubClass) { + this.joinedSubClass = joinedSubClass; + } + + public void doSecondPass(Map persistentClasses, Map inheritedMetas) throws MappingException { + if (rootClass != null) { + rootClass.createPrimaryKey(); + } + else if (joinedSubClass != null) { + joinedSubClass.createPrimaryKey(); + joinedSubClass.createForeignKey(); + } + else { + throw new AssertionError( "rootClass and joinedSubClass are null" ); + } + } +} Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java 2006-03-29 03:32:24 UTC (rev 9709) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java 2006-03-29 08:56:23 UTC (rev 9710) @@ -71,15 +71,16 @@ TvMagazin mag = new TvMagazin(); mag.time = new Date(); mag.id = pk; - pk.name = "Trax"; + //pk.name = "Trax"; pk.channel = channel; pk.presenter = pres; s.persist( mag ); tx.commit(); s.clear(); tx = s.beginTransaction(); - mag = (TvMagazin) s.createQuery( "from TvMagazin mag where mag.id.name = :name") - .setParameter( "name", "Trax" ).uniqueResult(); + mag = (TvMagazin) s.createQuery( "from TvMagazin mag") // where mag.id.name = :name") + //.setParameter( "name", "Trax" ) + .uniqueResult(); assertNotNull( mag.id ); assertNotNull( mag.id.channel ); assertEquals( channel.id, mag.id.channel.id ); Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java 2006-03-29 03:32:24 UTC (rev 9709) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java 2006-03-29 08:56:23 UTC (rev 9710) @@ -12,7 +12,7 @@ public class TvMagazinPk implements Serializable { @ManyToOne public Channel channel; - public String name; + //public String name; @ManyToOne public Presenter presenter; } |