Author: epbernard Date: 2006-03-07 06:36:38 -0500 (Tue, 07 Mar 2006) New Revision: 9560 Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3ClassAnnotationReader.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Location.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Move.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Trip.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/XAnnotatedElementTestCase.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/ Removed: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/XMLAnnotationReader.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/XAnnotatedElementTest.java Modified: trunk/HibernateExt/metadata/lib/ejb3-persistence.jar trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AbstractPropertyHolder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3JoinColumn.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolderBuilder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaAnnotationReader.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXAnnotatedElement.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/join/Death.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Area.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Captain.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Dictionary.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/SpaceShip.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/package-info.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java Log: ANN-270 ANN-271 ANN-272 ANN-273 Start of XML overriding engine Modified: trunk/HibernateExt/metadata/lib/ejb3-persistence.jar =================================================================== (Binary files differ) Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AbstractPropertyHolder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AbstractPropertyHolder.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AbstractPropertyHolder.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -9,6 +9,9 @@ import javax.persistence.Embeddable; import javax.persistence.Entity; import javax.persistence.MappedSuperclass; +import javax.persistence.JoinColumn; +import javax.persistence.AssociationOverride; +import javax.persistence.AssociationOverrides; import org.hibernate.reflection.ReflectionManager; import org.hibernate.reflection.XAnnotatedElement; @@ -23,12 +26,14 @@ private PropertyHolder parent; private Map<String, Column[]> holderColumnOverride; private Map<String, Column[]> currentPropertyColumnOverride; + private Map<String, JoinColumn[]> holderJoinColumnOverride; + private Map<String, JoinColumn[]> currentPropertyJoinColumnOverride; private String path; public AbstractPropertyHolder(String path, PropertyHolder parent, XClass clazzToProcess) { this.path = path; this.parent = parent; - this.holderColumnOverride = buildHierarchyColumnOverride( clazzToProcess ); + buildHierarchyColumnOverride( clazzToProcess ); } public String getPath() { @@ -41,6 +46,7 @@ protected void setCurrentProperty(XProperty property) { if (property == null) { this.currentPropertyColumnOverride = null; + this.currentPropertyJoinColumnOverride = null; } else { this.currentPropertyColumnOverride = buildColumnOverride( @@ -50,6 +56,13 @@ if (this.currentPropertyColumnOverride.size() == 0) { this.currentPropertyColumnOverride = null; } + this.currentPropertyJoinColumnOverride = buildJoinColumnOverride( + property, + getPath() + ); + if (this.currentPropertyJoinColumnOverride.size() == 0) { + this.currentPropertyJoinColumnOverride = null; + } } } @@ -70,24 +83,46 @@ return override; } - private Map<String, Column[]> buildHierarchyColumnOverride(XClass element) { + /** + * Get column overriding, property first, then parent, then holder + */ + public JoinColumn[] getOverriddenJoinColumn(String propertyName) { + JoinColumn[] override = null; + if (override == null && parent != null) { + override = parent.getOverriddenJoinColumn( propertyName ); + } + if (override == null && currentPropertyJoinColumnOverride != null) { + override = currentPropertyJoinColumnOverride.get( propertyName ); + } + if (override == null && holderJoinColumnOverride != null) { + override = holderJoinColumnOverride.get( propertyName ); + } + return override; + } + + private void buildHierarchyColumnOverride(XClass element) { XClass current = element; Map<String, Column[]> columnOverride = new HashMap<String, Column[]>(); + Map<String, JoinColumn[]> joinColumnOverride = new HashMap<String, JoinColumn[]>(); while ( current != null && ! ReflectionManager.INSTANCE.toXClass( Object.class ).equals( current ) ) { if ( current.isAnnotationPresent( Entity.class) || current.isAnnotationPresent( MappedSuperclass.class) || current.isAnnotationPresent( Embeddable.class) ) { //FIXME is embeddable override? Map<String, Column[]> currentOverride = buildColumnOverride( current, getPath() ); + Map<String, JoinColumn[]> currentJoinOverride = buildJoinColumnOverride( current, getPath() ); currentOverride.putAll(columnOverride); //subclasses have precedence over superclasses + currentJoinOverride.putAll(joinColumnOverride); //subclasses have precedence over superclasses columnOverride = currentOverride; + joinColumnOverride = currentJoinOverride; } current = current.getSuperclass(); } - return columnOverride.size() > 0 ? columnOverride : null; + holderColumnOverride = columnOverride.size() > 0 ? columnOverride : null; + holderJoinColumnOverride = joinColumnOverride.size() > 0 ? joinColumnOverride : null; } - private Map<String, Column[]> buildColumnOverride(XAnnotatedElement element, String path) { + private static Map<String, Column[]> buildColumnOverride(XAnnotatedElement element, String path) { Map<String, Column[]> columnOverride = new HashMap<String, Column[]>(); if (element == null) return columnOverride; AttributeOverride singleOverride = element.getAnnotation( AttributeOverride.class ); @@ -114,4 +149,32 @@ } return columnOverride; } + + private static Map<String, JoinColumn[]> buildJoinColumnOverride(XAnnotatedElement element, String path) { + Map<String, JoinColumn[]> columnOverride = new HashMap<String, JoinColumn[]>(); + if (element == null) return columnOverride; + AssociationOverride singleOverride = element.getAnnotation( AssociationOverride.class ); + AssociationOverrides multipleOverrides = element.getAnnotation( AssociationOverrides.class ); + AssociationOverride[] overrides; + if ( singleOverride != null ) { + overrides = new AssociationOverride[]{singleOverride}; + } + else if ( multipleOverrides != null ) { + overrides = multipleOverrides.value(); + } + else { + overrides = null; + } + + //fill overriden columns + if ( overrides != null ) { + for ( AssociationOverride depAttr : overrides ) { + columnOverride.put( + StringHelper.qualify( path, depAttr.name() ), + depAttr.joinColumns() + ); + } + } + return columnOverride; + } } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -44,6 +44,7 @@ import javax.persistence.TableGenerator; import javax.persistence.Transient; import javax.persistence.Version; +import javax.persistence.SqlResultSetMappings; import net.sf.cglib.transform.impl.InterceptFieldCallback; @@ -187,6 +188,14 @@ QueryBinder.bindSqlResultsetMapping( ann, mappings ); } { + SqlResultSetMappings ann = annotatedElement.getAnnotation( SqlResultSetMappings.class ); + if (ann != null) { + for ( SqlResultSetMapping current : ann.value() ) { + QueryBinder.bindSqlResultsetMapping( current, mappings ); + } + } + } + { NamedQuery ann = annotatedElement.getAnnotation( NamedQuery.class ); QueryBinder.bindQuery( ann, mappings ); } @@ -914,26 +923,23 @@ } //process @JoinColumn(s) before @Column(s) to handle collection of elements properly - if ( property.isAnnotationPresent( JoinColumn.class ) ) { - JoinColumn ann = (JoinColumn) property.getAnnotation( JoinColumn.class ); - joinColumns = new Ejb3JoinColumn[1]; - joinColumns[0] = Ejb3JoinColumn.buildJoinColumn( - ann, - entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(), mappings - ); - } - else if ( property.isAnnotationPresent( JoinColumns.class ) ) { - JoinColumns ann = property.getAnnotation( JoinColumns.class ); - JoinColumn[] annColumns = ann.value(); - int length = annColumns.length; - if ( length == 0 ) { - throw new AnnotationException( "Cannot bind an empty @JoinColumns" ); + { + JoinColumn[] anns = null; + if ( property.isAnnotationPresent( JoinColumn.class ) ) { + anns = new JoinColumn[] { property.getAnnotation( JoinColumn.class ) }; } - joinColumns = new Ejb3JoinColumn[length]; - for ( int index = 0; index < length ; index++ ) { - joinColumns[index] = Ejb3JoinColumn.buildJoinColumn( - annColumns[index], - entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(), mappings + else if ( property.isAnnotationPresent( JoinColumns.class ) ) { + JoinColumns ann = property.getAnnotation( JoinColumns.class ); + anns = ann.value(); + int length = anns.length; + if ( length == 0 ) { + throw new AnnotationException( "Cannot bind an empty @JoinColumns" ); + } + } + if (anns != null) { + joinColumns = Ejb3JoinColumn.buildJoinColumns( + anns, null, entityBinder.getSecondaryTables(), + propertyHolder, inferredData.getPropertyName(), mappings ); } } @@ -958,7 +964,6 @@ ( property.isAnnotationPresent( ManyToOne.class ) || property.isAnnotationPresent( OneToOne.class ) ) ) { - joinColumns = new Ejb3JoinColumn[1]; if ( property.isAnnotationPresent( JoinTable.class ) ) { JoinTable assocTable = property.getAnnotation( JoinTable.class ); //entityBinder.firstLevelSecondaryTablesBinding(assocTable); @@ -971,7 +976,7 @@ String mappedBy = oneToOneAnn != null ? oneToOneAnn.mappedBy() : null; - joinColumns[0] = Ejb3JoinColumn.buildImplicitJoinColumn( + joinColumns = Ejb3JoinColumn.buildJoinColumns( (JoinColumn[]) null, mappedBy, entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(), mappings ); @@ -980,12 +985,11 @@ else if ( joinColumns == null && ( property.isAnnotationPresent( OneToMany.class ) || property.isAnnotationPresent( CollectionOfElements.class ) ) ) { - joinColumns = new Ejb3JoinColumn[1]; OneToMany oneToMany = (OneToMany) property.getAnnotation( OneToMany.class ); String mappedBy = oneToMany != null ? oneToMany.mappedBy() : ""; - joinColumns[0] = Ejb3JoinColumn.buildImplicitJoinColumn( + joinColumns = Ejb3JoinColumn.buildJoinColumns( (JoinColumn[]) null, mappedBy, entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(), mappings ); @@ -1035,9 +1039,6 @@ //manage composite related metadata Embeddable embeddableAnn = (Embeddable) returnedClass.getAnnotation( Embeddable.class ); - Map<String, Column[]> columnOverride = PropertyHolderBuilder.buildColumnOverride( - property, propertyHolder.getPath() + '.' + inferredData.getPropertyName() - ); //guess if its a component and find id data access (property, field etc) final boolean isComponent = embeddableAnn != null || property.isAnnotationPresent( EmbeddedId.class ); boolean propertyAnnotated = entityBinder.isPropertyAnnotated( returnedClass ); @@ -1379,11 +1380,11 @@ annJoins = null; annInverseJoins = null; } - Ejb3JoinColumn[] joinColumns = buildJoinTableJoinColumns( + Ejb3JoinColumn[] joinColumns = Ejb3JoinColumn.buildJoinTableJoinColumns( annJoins, entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(), mappedBy, mappings ); - Ejb3JoinColumn[] inverseJoinColumns = buildJoinTableJoinColumns( + Ejb3JoinColumn[] inverseJoinColumns = Ejb3JoinColumn.buildJoinTableJoinColumns( annInverseJoins, entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(), mappedBy, mappings ); @@ -1393,52 +1394,6 @@ collectionBinder.setInverseJoinColumns( inverseJoinColumns ); } - private static Ejb3JoinColumn[] buildJoinTableJoinColumns( - JoinColumn[] annJoins, Map<String, Join> secondaryTables, - PropertyHolder propertyHolder, String propertyName, String mappedBy, ExtendedMappings mappings - ) { - Ejb3JoinColumn[] joinColumns; - if ( annJoins == null ) { - Ejb3JoinColumn currentJoinColumn = new Ejb3JoinColumn(); - currentJoinColumn.setImplicit( true ); - currentJoinColumn.setNullable( false ); //I break the spec, but it's for good - currentJoinColumn.setPropertyHolder( propertyHolder ); - currentJoinColumn.setJoins( secondaryTables ); - currentJoinColumn.setMappings( mappings ); - currentJoinColumn.setPropertyName( - BinderHelper.getRelativePath( propertyHolder, propertyName ) - ); - currentJoinColumn.setMappedBy( mappedBy ); - currentJoinColumn.bind(); - - joinColumns = new Ejb3JoinColumn[]{ - currentJoinColumn - - }; - } - else { - joinColumns = new Ejb3JoinColumn[annJoins.length]; - JoinColumn annJoin; - int length = annJoins.length; - for ( int index = 0; index < length ; index++ ) { - annJoin = annJoins[index]; - Ejb3JoinColumn currentJoinColumn = new Ejb3JoinColumn(); - currentJoinColumn.setImplicit( true ); - currentJoinColumn.setPropertyHolder( propertyHolder ); - currentJoinColumn.setJoins( secondaryTables ); - currentJoinColumn.setMappings( mappings ); - currentJoinColumn.setPropertyName( BinderHelper.getRelativePath( propertyHolder, propertyName ) ); - currentJoinColumn.setMappedBy( mappedBy ); - currentJoinColumn.setJoinAnnotation( annJoin, propertyName ); - currentJoinColumn.setNullable( false ); //I break the spec, but it's for good - //done after the annotation to override it - currentJoinColumn.bind(); - joinColumns[index] = currentJoinColumn; - } - } - return joinColumns; - } - private static void bindComponent( PropertyData inferredData, PropertyHolder propertyHolder, Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -197,9 +197,8 @@ hbmEntities = new HashMap<String, Document>(); annotatedClassEntities = new HashMap<String, XClass>(); hbmDocuments = new ArrayList<Document>(); - //bindingColumnNamePerTable = new HashMap<Table, ExtendedMappings.ColumnNames>(); namingStrategy = EJB3NamingStrategy.INSTANCE; - //bindingTableNames = new HashMap<String, ExtendedMappings.TableDescription>(); + setEntityResolver( EJB3DTDEntityResolver.INSTANCE ); } @Override Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3JoinColumn.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3JoinColumn.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3JoinColumn.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -58,11 +58,14 @@ this.mappedBy = mappedBy; } - public Ejb3JoinColumn() { + //Due to @AnnotationOverride overriding rules, I don't want the constructor to be public + private Ejb3JoinColumn() { setMappedBy( AnnotationBinder.ANNOTATION_STRING_DEFAULT ); } - public Ejb3JoinColumn( + //Due to @AnnotationOverride overriding rules, I don't want the constructor to be public + //TODO get rid of it and use setters + private Ejb3JoinColumn( String sqlType, String name, boolean nullable, @@ -100,14 +103,54 @@ return referencedColumn; } - public static Ejb3JoinColumn buildJoinColumn( + public static Ejb3JoinColumn[] buildJoinColumns( + JoinColumn[] anns, + String mappedBy, Map<String, Join> joins, + PropertyHolder propertyHolder, + String propertyName, + ExtendedMappings mappings + ) { + JoinColumn[] actualColumns = propertyHolder.getOverriddenJoinColumn( + StringHelper.qualify( propertyHolder.getPath(), propertyName ) + ); + if ( actualColumns == null ) actualColumns = anns; + if (actualColumns == null) { + return new Ejb3JoinColumn[] { + buildJoinColumn( (JoinColumn) null, mappedBy, joins, propertyHolder, propertyName, mappings ) + }; + } + else { + int size = actualColumns.length; + Ejb3JoinColumn[] result = new Ejb3JoinColumn[ size ]; + for ( int index = 0 ; index < size ; index++ ) { + result[index] = buildJoinColumn( + actualColumns[index], + mappedBy, + joins, + propertyHolder, + propertyName, + mappings + ); + } + return result; + } + } + + /** + * build join column for SecondaryTables + */ + private static Ejb3JoinColumn buildJoinColumn( JoinColumn ann, - Map<String, Join> joins, + String mappedBy, Map<String, Join> joins, PropertyHolder propertyHolder, String propertyName, ExtendedMappings mappings ) { if ( ann != null ) { + if ( AnnotationBinder.isDefault( mappedBy ) ) { + throw new AnnotationException("Illegal attempt to define a @JoinColumn with a mappedBy association: " + + BinderHelper.getRelativePath( propertyHolder, propertyName ) ); + } Ejb3JoinColumn joinColumn = new Ejb3JoinColumn(); joinColumn.setJoinAnnotation( ann, null ); joinColumn.setJoins( joins ); @@ -120,6 +163,7 @@ } else { Ejb3JoinColumn joinColumn = new Ejb3JoinColumn(); + joinColumn.setMappedBy( mappedBy ); joinColumn.setJoins( joins ); joinColumn.setPropertyHolder( propertyHolder ); joinColumn.setPropertyName( BinderHelper.getRelativePath( propertyHolder, propertyName ) ); @@ -127,7 +171,6 @@ joinColumn.setMappings( mappings ); joinColumn.bind(); return joinColumn; - //return buildImplicitJoinColumn( AnnotationBinder.ANNOTATION_STRING_DEFAULT, joins, propertyHolder, propertyName, mappings); } } @@ -150,62 +193,10 @@ } } - public static Ejb3JoinColumn buildImplicitJoinColumn( - String mappedBy, - Map<String, Join> joins, - PropertyHolder propertyHolder, - String propertyName, - ExtendedMappings mappings - ) { - return new Ejb3JoinColumn( - (String) null, null, - true, false, true, true, null, (String) null, joins, - propertyHolder, propertyName, mappedBy, true, mappings - ); - } - /** - * Build an Ejb3JoinColumn from a potential annotation and - * the identifier it refers to - * - * @param ann JoinColumn annotation - * @param identifier value explaining the identifier - * @param propertyHolder - * @param mappings mappings - * @return Ejb3JoinColumn + * Build JoinColumn for a JOINED hierarchy */ public static Ejb3JoinColumn buildJoinColumn( - JoinColumn ann, - Value identifier, - Map<String, Join> joins, - PropertyHolder propertyHolder, ExtendedMappings mappings - ) { - - Column col = (Column) identifier.getColumnIterator().next(); - String defaultName = mappings.getLogicalColumnName( col.getName(), identifier.getTable() ); - if ( ann != null ) { - String sqlType = ann.columnDefinition().equals( "" ) ? null : ann.columnDefinition(); - String name = ann.name().equals( "" ) ? defaultName : ann.name(); - return new Ejb3JoinColumn( - sqlType, - name, ann.nullable(), ann.unique(), - ann.insertable(), ann.updatable(), - ann.referencedColumnName(), - ann.table(), - joins, - propertyHolder, null, null, false, mappings - ); - } - else { - return new Ejb3JoinColumn( - (String) null, defaultName, - true, false, true, true, null, (String) null, - joins, propertyHolder, null, null, false, mappings - ); - } - } - - public static Ejb3JoinColumn buildJoinColumn( PrimaryKeyJoinColumn ann, Value identifier, Map<String, Join> joins, @@ -430,4 +421,50 @@ public void setMappedByTableName(String mappedByTableName) { this.mappedByTableName = mappedByTableName; } + + public static Ejb3JoinColumn[] buildJoinTableJoinColumns( + JoinColumn[] annJoins, Map<String, Join> secondaryTables, + PropertyHolder propertyHolder, String propertyName, String mappedBy, ExtendedMappings mappings + ) { + Ejb3JoinColumn[] joinColumns; + if ( annJoins == null ) { + Ejb3JoinColumn currentJoinColumn = new Ejb3JoinColumn(); + currentJoinColumn.setImplicit( true ); + currentJoinColumn.setNullable( false ); //I break the spec, but it's for good + currentJoinColumn.setPropertyHolder( propertyHolder ); + currentJoinColumn.setJoins( secondaryTables ); + currentJoinColumn.setMappings( mappings ); + currentJoinColumn.setPropertyName( + BinderHelper.getRelativePath( propertyHolder, propertyName ) + ); + currentJoinColumn.setMappedBy( mappedBy ); + currentJoinColumn.bind(); + + joinColumns = new Ejb3JoinColumn[]{ + currentJoinColumn + + }; + } + else { + joinColumns = new Ejb3JoinColumn[annJoins.length]; + JoinColumn annJoin; + int length = annJoins.length; + for ( int index = 0; index < length ; index++ ) { + annJoin = annJoins[index]; + Ejb3JoinColumn currentJoinColumn = new Ejb3JoinColumn(); + currentJoinColumn.setImplicit( true ); + currentJoinColumn.setPropertyHolder( propertyHolder ); + currentJoinColumn.setJoins( secondaryTables ); + currentJoinColumn.setMappings( mappings ); + currentJoinColumn.setPropertyName( BinderHelper.getRelativePath( propertyHolder, propertyName ) ); + currentJoinColumn.setMappedBy( mappedBy ); + currentJoinColumn.setJoinAnnotation( annJoin, propertyName ); + currentJoinColumn.setNullable( false ); //I break the spec, but it's for good + //done after the annotation to override it + currentJoinColumn.bind(); + joinColumns[index] = currentJoinColumn; + } + } + return joinColumns; + } } \ No newline at end of file Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolder.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolder.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -1,6 +1,7 @@ package org.hibernate.cfg; import javax.persistence.Column; +import javax.persistence.JoinColumn; import org.hibernate.mapping.KeyValue; import org.hibernate.mapping.PersistentClass; @@ -32,6 +33,11 @@ */ Column[] getOverriddenColumn(String propertyName); + /** + * return null if the column is not overridden, or an array of column if true + */ + JoinColumn[] getOverriddenJoinColumn(String propertyName); + String getEntityName(); void addProperty(Property prop, Ejb3Column[] columns); Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolderBuilder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolderBuilder.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolderBuilder.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -1,24 +1,14 @@ //$Id$ package org.hibernate.cfg; -import java.util.HashMap; import java.util.Map; -import javax.persistence.AttributeOverride; -import javax.persistence.AttributeOverrides; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.MappedSuperclass; -import javax.persistence.Embeddable; import org.hibernate.mapping.Collection; import org.hibernate.mapping.Component; -import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Join; -import org.hibernate.reflection.XAnnotatedElement; +import org.hibernate.mapping.PersistentClass; import org.hibernate.reflection.XClass; -import org.hibernate.reflection.ReflectionManager; import org.hibernate.reflection.XProperty; -import org.hibernate.util.StringHelper; /** * This factory is here ot build a PropertyHolder and prevent .mapping interface adding @@ -61,46 +51,4 @@ return buildPropertyHolder( null, persistentClass, joins ); } - public static Map<String, Column[]> buildHierarchyColumnOverride(XClass element, String path) { - XClass current = element; - Map<String, Column[]> columnOverride = new HashMap<String, Column[]>(); - while ( ! ReflectionManager.INSTANCE.toXClass( Object.class ).equals( current ) ) { - if ( current.isAnnotationPresent(Entity.class) || current.isAnnotationPresent(MappedSuperclass.class) - || current.isAnnotationPresent(Embeddable.class) ) { - //FIXME is embeddable override? - Map<String, Column[]> currentOverride = buildColumnOverride( current, path ); - currentOverride.putAll(columnOverride); //subclasses have precedence over superclasses - columnOverride = currentOverride; - } - current = current.getSuperclass(); - } - - return columnOverride; - } - - public static Map<String, Column[]> buildColumnOverride(XAnnotatedElement element, String path) { - AttributeOverride singleOverride = element.getAnnotation( AttributeOverride.class ); - AttributeOverrides multipleOverrides = element.getAnnotation( AttributeOverrides.class ); - AttributeOverride[] overrides; - if ( singleOverride != null ) { - overrides = new AttributeOverride[]{singleOverride}; - } - else if ( multipleOverrides != null ) { - overrides = multipleOverrides.value(); - } - else { - overrides = null; - } - Map<String, Column[]> columnOverride = new HashMap<String, Column[]>(); - //fill overriden columns - if ( overrides != null ) { - for ( AttributeOverride depAttr : overrides ) { - columnOverride.put( - StringHelper.qualify( path, depAttr.name() ), - new Column[]{depAttr.column()} - ); - } - } - return columnOverride; - } } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -6,9 +6,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; - import javax.persistence.Entity; -import javax.persistence.JoinColumn; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.PrimaryKeyJoinColumns; import javax.persistence.SecondaryTable; @@ -355,7 +353,7 @@ if ( nbrOfJoinColumns == 0 ) { ejb3JoinColumns = new Ejb3JoinColumn[1]; ejb3JoinColumns[0] = Ejb3JoinColumn.buildJoinColumn( - (JoinColumn) null, + (PrimaryKeyJoinColumn) null, persistentClass.getIdentifier(), secondaryTables, propertyHolder, mappings Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -71,9 +71,10 @@ * 2. list all the properties following the expected one in the parent property * 3. calculate the lowest index and insert the property */ - PersistentClass pc = mappings.getClass( entity.name() ); + PersistentClass pc = mappings.getClass( entity.entityClass().getName() ); if (pc == null) - throw new MappingException( "Entity not found " + entity.name() + " in SqlResultsetMapping " + ann.name() ); + throw new MappingException( "Entity not found " + entity.entityClass().getName() + + " in SqlResultsetMapping " + ann.name() ); int dotIndex = name.lastIndexOf( '.' ); String reducedName = name.substring( 0, dotIndex ); Iterator parentPropIter = getSubPropertyIterator( pc, reducedName ); @@ -107,7 +108,7 @@ if ( uniqueReturnProperty.contains( name ) ) { throw new MappingException( "duplicate @FieldResult for property " + name + - " on @Entity " + entity.name() + " in " + ann.name() + " on @Entity " + entity.entityClass().getName() + " in " + ann.name() ); } uniqueReturnProperty.add(name); @@ -135,7 +136,7 @@ propertyresults = propertyresults.isEmpty() ? CollectionHelper.EMPTY_MAP : propertyresults; SQLQueryRootReturn result = - new SQLQueryRootReturn( "alias" + entityAliasIndex++, entity.name(), propertyresults, LockMode.READ ); + new SQLQueryRootReturn( "alias" + entityAliasIndex++, entity.entityClass().getName(), propertyresults, LockMode.READ ); definition.addEntityQueryReturn( result ); } Copied: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3ClassAnnotationReader.java (from rev 9528, trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/XMLAnnotationReader.java) =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/XMLAnnotationReader.java 2006-03-01 04:24:08 UTC (rev 9528) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3ClassAnnotationReader.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -0,0 +1,103 @@ +package org.hibernate.reflection.java; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; +import java.util.Map; +import java.util.HashMap; +import java.util.List; +import java.util.ArrayList; + +import javax.persistence.Entity; +import javax.persistence.MappedSuperclass; +import javax.persistence.Embeddable; + +import org.dom4j.Element; +import org.hibernate.annotationfactory.AnnotationDescriptor; +import org.hibernate.annotationfactory.AnnotationFactory; +import org.hibernate.reflection.java.xml.XMLContext; + +/** + * Encapsulates the overriding of Java annotations from an EJB 3.0 descriptor. + * + * @author Paolo Perrotta + * @author Davide Marchignoli + */ +class EJB3ClassAnnotationReader extends JavaAnnotationReader { + private XMLContext xmlContext; + private String className; + private static final Map<Class, String> annotationToXml; + + static { + annotationToXml = new HashMap<Class, String>(); + annotationToXml.put(Entity.class, "entity"); + annotationToXml.put(MappedSuperclass.class, "mapped-superclass"); + annotationToXml.put(Embeddable.class, "embeddable"); + } + + public EJB3ClassAnnotationReader( AnnotatedElement el, XMLContext xmlContext ) { + super( el ); + this.xmlContext = xmlContext; + if (el instanceof Class) { + Class clazz = (Class) el; + className = clazz.getName(); + } + } + + public <T extends Annotation> T getAnnotation(Class<T> annotationType) { + + return super.getAnnotation( annotationType ); + } + + public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType) { + return super.isAnnotationPresent( annotationType ); + } + + public Annotation[] getAnnotations() { + XMLContext.Default defaults = xmlContext.getDefault(className); + Element tree = xmlContext.getXMLTree( className, null); + Annotation[] annotations = super.getAnnotations(); + List<Annotation> annotationList = new ArrayList<Annotation>(annotations.length + 5); + for (Annotation annotation : annotations) { + if (! annotationToXml.containsKey( annotation ) ) { + //unknown annotations are left over + annotationList.add(annotation); + } + } + Annotation current = getEntity(tree, defaults); + if (current != null) annotationList.add(current); + return super.getAnnotations(); + } + + private Entity getEntity(Element tree, XMLContext.Default defaults) { + if (tree == null) { + return Boolean.TRUE.equals( defaults.getMetadataComplete() ) ? super.getAnnotation( Entity.class ) : null; + } + else { + if ( "entity".equals( tree.getName() ) ) { + AnnotationDescriptor entity = new AnnotationDescriptor( Entity.class ); + entity.setValue( "name", tree.attributeValue( "name", "" ) ); + return AnnotationFactory.create( entity ); + } + else { + return null; //this is not an entity + } + } + } + + private Annotation getTopLevelElement(Class<Annotation> annotation, Element tree, XMLContext.Default defaults) { + if (tree == null) { + return getAnnotation( annotation ); + } + else { + if ( tree.getName().equals( annotationToXml.get( annotation ) ) ) { + //TODO resume *********************************** + return null; + } + else { + return null; //this is not an entity + } + } + } + + +} Property changes on: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3ClassAnnotationReader.java ___________________________________________________________________ Name: svn:eol-style + native Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaAnnotationReader.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaAnnotationReader.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaAnnotationReader.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -11,7 +11,7 @@ */ class JavaAnnotationReader { - private final AnnotatedElement element; + protected final AnnotatedElement element; public JavaAnnotationReader( AnnotatedElement el ) { this.element = el; Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXAnnotatedElement.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXAnnotatedElement.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXAnnotatedElement.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -4,9 +4,8 @@ import java.lang.reflect.AnnotatedElement; import org.hibernate.reflection.XAnnotatedElement; +import org.hibernate.reflection.java.xml.XMLContext; -import org.dom4j.Document; - /** * @author Paolo Perrotta * @author Davide Marchignoli @@ -15,6 +14,7 @@ // responsible for extracting annotations private JavaAnnotationReader annotationReader; + private final XMLContext xmlContext; private final JavaXFactory factory; @@ -24,6 +24,7 @@ this.annotationReader = new JavaAnnotationReader( annotatedElement ); this.factory = factory; this.annotatedElement = annotatedElement; + this.xmlContext = factory.getXMLContext(); } protected JavaXFactory getFactory() { @@ -34,12 +35,6 @@ return annotationReader; } - public void setXMLDescriptor(Document xml) { - if ( xml == null ) - return; - annotationReader = new XMLAnnotationReader( this.toAnnotatedElement(), xml ); - } - public <T extends Annotation> T getAnnotation(Class<T> annotationType) { return getAnnotationReader().getAnnotation( annotationType ); } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -9,7 +9,8 @@ import java.util.HashMap; import java.util.Map; -import org.dom4j.Document; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.hibernate.reflection.ReflectionManager; import org.hibernate.reflection.XClass; import org.hibernate.reflection.XMethod; @@ -20,7 +21,10 @@ import org.hibernate.reflection.java.generics.TypeEnvironmentFactory; import org.hibernate.reflection.java.generics.TypeSwitch; import org.hibernate.reflection.java.generics.TypeUtils; +import org.hibernate.reflection.java.xml.XMLContext; import org.hibernate.util.ReflectHelper; +import org.hibernate.util.XMLHelper; +import org.xml.sax.EntityResolver; /** * The factory for all the objects in this package. @@ -30,6 +34,11 @@ */ public class JavaXFactory implements ReflectionManager { + private static Log log = LogFactory.getLog( JavaXFactory.class ); + private transient XMLHelper xmlHelper; + private EntityResolver entityResolver; + private XMLContext xmlContext; + private static class PropertyKey extends Pair<Member, XClass> { PropertyKey(Member member, XClass owner) { super( member, owner ); @@ -51,14 +60,14 @@ private final TypeEnvironmentFactory typeEnvs = new TypeEnvironmentFactory(); - private final Document xml; - public JavaXFactory() { - this.xml = null; + reset(); } - public JavaXFactory(Document xmlDescriptor) { - this.xml = xmlDescriptor; + private void reset() { + xmlHelper = new XMLHelper(); + entityResolver = XMLHelper.DEFAULT_DTD_RESOLVER; + xmlContext = new XMLContext(); } public XClass toXClass(Class clazz) { @@ -88,7 +97,8 @@ JavaXClass result = xClasses.get( key ); if ( result == null ) { result = new JavaXClass( classType, context, JavaXFactory.this ); - result.setXMLDescriptor( xml ); + //TODO get rid of it + //result.setXMLDescriptor( xml ); xClasses.put( key, result ); } return result; @@ -105,7 +115,8 @@ JavaXPackage xPackage = packagesToXPackages.get( pkg ); if ( xPackage == null ) { xPackage = new JavaXPackage( pkg, this ); - xPackage.setXMLDescriptor( xml ); + //TODO get rid of it + //xPackage.setXMLDescriptor( xml ); packagesToXPackages.put( pkg, xPackage ); } return xPackage; @@ -302,4 +313,8 @@ } return ( (JavaXClass) class1 ).toClass().equals( class2 ); } + + XMLContext getXMLContext() { + return xmlContext; + } } Deleted: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/XMLAnnotationReader.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/XMLAnnotationReader.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/XMLAnnotationReader.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -1,36 +0,0 @@ -package org.hibernate.reflection.java; - -import java.lang.annotation.Annotation; -import java.lang.reflect.AnnotatedElement; - -import org.dom4j.Document; - -/** - * Encapsulates the overriding of Java annotations from an EJB 3.0 descriptor. - * - * @author Paolo Perrotta - * @author Davide Marchignoli - */ -class XMLAnnotationReader extends JavaAnnotationReader { - - public XMLAnnotationReader( AnnotatedElement el, Document xmlDescriptor ) { - super( el ); - // TODO: it just ignores the XML for now. write the overrides - // - // This class is supposed to use the facilities in package - // annotationfactory to actually instance annotations (maybe we should - // move the whole package here?) - } - - public <T extends Annotation> T getAnnotation(Class<T> annotationType) { - return super.getAnnotation( annotationType ); - } - - public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType) { - return super.isAnnotationPresent( annotationType ); - } - - public Annotation[] getAnnotations() { - return super.getAnnotations(); - } -} Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -0,0 +1,183 @@ +//$Id: $ +package org.hibernate.reflection.java.xml; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.Element; +import org.hibernate.util.StringHelper; + +/** + * @author Emmanuel Bernard + */ +public class XMLContext { + private static Log log = LogFactory.getLog( XMLContext.class ); + private Default globalDefaults; + private Map<String,Element> classOverriding = new HashMap<String, Element>(); + private Map<String,Default> defaultsOverriding = new HashMap<String, Default>(); + + public void addDocument(Document doc) { + Element root = doc.getRootElement(); + + //global defaults + Element metadata = root.element( "persistence-unit-metadata" ); + if (metadata != null) { + if (globalDefaults == null) { + globalDefaults = new Default(); + globalDefaults.setMetadataComplete( + metadata.element( "xml-mapping-metadata-complete" ) != null ? + Boolean.TRUE : + null + ); + Element defaultElement = metadata.element( "persistence-unit-defaults" ); + Element unitElement = defaultElement.element( "schema" ); + globalDefaults.setSchema( unitElement != null ? unitElement.getTextTrim() : null ); + unitElement = defaultElement.element( "catalog" ); + globalDefaults.setCatalog( unitElement != null ? unitElement.getTextTrim() : null ); + unitElement = defaultElement.element( "access" ); + globalDefaults.setAccess( unitElement != null ? unitElement.getTextTrim() : null ); + unitElement = defaultElement.element( "cascade-persist" ); + globalDefaults.setCascadePersist( unitElement != null ? Boolean.TRUE : null ); + //TODO entity listeners + } + else { + log.warn("Found more than one <persistence-unit-metadata>, ignored"); + } + } + + //entity mapping default + Default entityMappingDefault = new Default(); + Element unitElement = root.element("package"); + String packageName = unitElement != null ? unitElement.getTextTrim() : ""; + entityMappingDefault.setPackageName( packageName ); + unitElement = root.element("schema"); + entityMappingDefault.setSchema( unitElement != null ? unitElement.getTextTrim() : null ); + unitElement = root.element("catalog"); + entityMappingDefault.setCatalog( unitElement != null ? unitElement.getTextTrim() : null ); + unitElement = root.element("access"); + entityMappingDefault.setAccess( unitElement != null ? unitElement.getTextTrim() : null ); + + + List<Element> entities = (List<Element>) root.elements( "entity" ); + addClass( entities, packageName, entityMappingDefault ); + + entities = (List<Element>) root.elements( "mapped-superclass" ); + addClass( entities, packageName, entityMappingDefault ); + + entities = (List<Element>) root.elements( "embeddable" ); + addClass( entities, packageName, entityMappingDefault ); + } + + private void addClass(List<Element> entities, String packageName, Default defaults) { + for (Element element : entities) { + Attribute attribute = element.attribute( "class" ); + String className = buildSafeClassName( attribute.getText(), packageName ); + if ( classOverriding.containsKey( className ) ) { + //maybe switch it to warn? + throw new IllegalStateException( "Duplicate XML entry for " + className); + } + classOverriding.put( className, element ); + Default localDefault = new Default(); + localDefault.override( defaults ); + attribute = element.attribute( "metadata-complete" ); + if (attribute != null) localDefault.setMetadataComplete( (Boolean) attribute.getData() ); + defaultsOverriding.put( className, localDefault ); + + log.debug( "Adding XML overriding information for " + className); + } + } + + private static String buildSafeClassName(String className, String defaultPackageName) { + if ( className.indexOf( '.' ) < 0 && defaultPackageName != null) { + className = StringHelper.qualify(defaultPackageName, className); + } + return className; + } + + public Default getDefault(String className) { + Default xmlDefault = new Default(); + xmlDefault.override( globalDefaults ); + Default entityMappingOverriding = defaultsOverriding.get( className ); + xmlDefault.override( entityMappingOverriding ); + return xmlDefault; + } + + public Element getXMLTree(String className, String methodName) { + return classOverriding.get(className); + } + + public static class Default { + private String access; + private String packageName; + private String schema; + private String catalog; + private Boolean metadataComplete; + private Boolean cascadePersist; + + public String getAccess() { + return access; + } + + protected void setAccess(String access) { + this.access = access; + } + + public String getCatalog() { + return catalog; + } + + protected void setCatalog(String catalog) { + this.catalog = catalog; + } + + public String getPackageName() { + return packageName; + } + + protected void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getSchema() { + return schema; + } + + protected void setSchema(String schema) { + this.schema = schema; + } + + public Boolean getMetadataComplete() { + return metadataComplete; + } + + protected void setMetadataComplete(Boolean metadataComplete) { + this.metadataComplete = metadataComplete; + } + + public Boolean getCascadePersist() { + return cascadePersist; + } + + void setCascadePersist(Boolean cascadePersist) { + this.cascadePersist = cascadePersist; + } + + public void override(Default globalDefault) { + if (globalDefault != null) { + if ( globalDefault.getAccess() != null) access = globalDefault.getAccess(); + if ( globalDefault.getPackageName() != null) packageName = globalDefault.getPackageName(); + if ( globalDefault.getSchema() != null) schema = globalDefault.getSchema(); + if ( globalDefault.getCatalog() != null) catalog = globalDefault.getCatalog(); + if ( globalDefault.getMetadataComplete() != null) metadataComplete = globalDefault.getMetadataComplete(); + //TODO fix that in stone if cascade-persist is set already? + if ( globalDefault.getCascadePersist() != null) cascadePersist = globalDefault.getCascadePersist(); + } + } + + } +} Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/join/Death.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/join/Death.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/join/Death.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -8,7 +8,7 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; -import javax.persistence.JoinColumn; +import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.SecondaryTable; /** @@ -18,7 +18,7 @@ @SecondaryTable( name="ExtendedDeath" ) -@JoinColumn(name="DEATH_ID") +@PrimaryKeyJoinColumn(name="DEATH_ID") public class Death implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer id; Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -0,0 +1,47 @@ +//$Id: $ +package org.hibernate.test.annotations.override; + +import org.hibernate.test.annotations.TestCase; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.HibernateException; + +/** + * @author Emmanuel Bernard + */ +public class AssociationOverrideTest extends TestCase { + + public void testOverriding() throws Exception { + Location paris = new Location(); + paris.setName( "Paris" ); + Location atlanta = new Location(); + atlanta.setName( "Atlanta" ); + Trip trip = new Trip(); + trip.setFrom( paris ); + //trip.setTo( atlanta ); + Session s = openSession(); + Transaction tx = s.beginTransaction(); + s.persist( paris ); + s.persist( atlanta ); + try { + s.persist( trip ); + s.flush(); + fail("Should be non nullable"); + } + catch( HibernateException e ) { + //success + } + finally { + tx.rollback(); + s.close(); + } + } + + protected Class[] getMappings() { + return new Class[] { + Location.class, + Move.class, + Trip.class + }; + } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Location.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Location.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Location.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -0,0 +1,21 @@ +//$Id: $ +package org.hibernate.test.annotations.override; + +import javax.persistence.Entity; +import javax.persistence.Id; + +/** + * @author Emmanuel Bernard + */ +@Entity +public class Location { + private String name; + + @Id public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Move.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Move.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Move.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -0,0 +1,46 @@ +//$Id: $ +package org.hibernate.test.annotations.override; + +import javax.persistence.MappedSuperclass; +import javax.persistence.ManyToOne; +import javax.persistence.Id; +import javax.persistence.GeneratedValue; +import javax.persistence.JoinColumn; + +/** + * @author Emmanuel Bernard + */ +@MappedSuperclass +public class Move { + private int id; + private Location from; + private Location to; + + @ManyToOne + public Location getFrom() { + return from; + } + + public void setFrom(Location from) { + this.from = from; + } + + @Id @GeneratedValue + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + @ManyToOne + @JoinColumn(name="to", nullable = true) + public Location getTo() { + return to; + } + + public void setTo(Location to) { + this.to = to; + } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Trip.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Trip.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Trip.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -0,0 +1,17 @@ +//$Id: $ +package org.hibernate.test.annotations.override; + +import javax.persistence.Entity; +import javax.persistence.AssociationOverrides; +import javax.persistence.AssociationOverride; +import javax.persistence.JoinColumn; + +/** + * @author Emmanuel Bernard + */ +@Entity +@AssociationOverrides( { + @AssociationOverride( name="from", joinColumns = @JoinColumn(name="from", nullable = false) ), + @AssociationOverride( name="to", joinColumns = @JoinColumn(name="to", nullable = false) ) +} ) +public class Trip extends Move {} Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Area.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Area.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Area.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -11,6 +11,7 @@ import javax.persistence.SqlResultSetMapping; import javax.persistence.Table; import javax.persistence.GeneratedValue; +import javax.persistence.SqlResultSetMappings; /** * Example of a entity load incl a join fetching of an associated *ToOne entity @@ -29,18 +30,20 @@ + "night.area_id, area.name from Night night, tbl_area area where night.area_id = area.id", resultSetMapping="joinMapping") } ) -@SqlResultSetMapping(name="joinMapping", entities={ - @EntityResult(name="org.hibernate.test.annotations.query.Night", fields = { - @FieldResult(name="id", column="nid"), - @FieldResult(name="duration", column="night_duration"), - @FieldResult(name="date", column="night_date"), - @FieldResult(name="area", column="area_id") - }), - @EntityResult(name="org.hibernate.test.annotations.query.Area", fields = { - @FieldResult(name="id", column="aid"), - @FieldResult(name="name", column="name") - }) - } +@SqlResultSetMappings( + @SqlResultSetMapping(name="joinMapping", entities={ + @EntityResult(entityClass=org.hibernate.test.annotations.query.Night.class, fields = { + @FieldResult(name="id", column="nid"), + @FieldResult(name="duration", column="night_duration"), + @FieldResult(name="date", column="night_date"), + @FieldResult(name="area", column="area_id") + }), + @EntityResult(entityClass=org.hibernate.test.annotations.query.Area.class, fields = { + @FieldResult(name="id", column="aid"), + @FieldResult(name="name", column="name") + }) + } + ) ) @Table(name="tbl_area") public class Area { Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Captain.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Captain.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Captain.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -16,7 +16,7 @@ @Entity @IdClass(Identity.class) @SqlResultSetMapping(name="compositekey", - entities=@EntityResult(name="org.hibernate.test.annotations.query.SpaceShip", + entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class, fields = { @FieldResult(name="name", column = "name"), @FieldResult(name="model", column = "model"), Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Dictionary.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Dictionary.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Dictionary.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -20,7 +20,7 @@ @SqlResultSetMapping( name="dictionary", entities = { @EntityResult( - name="org.hibernate.test.annotations.query.Dictionary", + entityClass=org.hibernate.test.annotations.query.Dictionary.class, fields = { @FieldResult(name="id", column="id"), @FieldResult(name="name", column="name"), Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/SpaceShip.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/SpaceShip.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/SpaceShip.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -16,7 +16,7 @@ * @author Emmanuel Bernard */ @Entity -@SqlResultSetMapping(name="implicit", entities=@EntityResult(name="org.hibernate.test.annotations.query.SpaceShip")) +@SqlResultSetMapping(name="implicit", entities=@EntityResult(entityClass = org.hibernate.test.annotations.query.SpaceShip.class)) @NamedNativeQueries( { @NamedNativeQuery(name="implicitSample", query ="select * from SpaceShip", resultSetMapping="implicit"), @NamedNativeQuery(name="compositekey", Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/package-info.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/package-info.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/package-info.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -16,7 +16,7 @@ name="sqlmapping", entities = { @EntityResult( - name="org.hibernate.test.annotations.query.Night", + entityClass=org.hibernate.test.annotations.query.Night.class, fields = { @FieldResult(name="id", column = "id"), @FieldResult(name="duration", column = "night_duration"), Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -16,7 +16,7 @@ /** * @author Paolo Perrotta */ -public class JavaXClassTest extends XAnnotatedElementTest { +public class JavaXClassTest extends XAnnotatedElementTestCase { XClass clazz; Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -17,7 +17,7 @@ /** * @author Paolo Perrotta */ -public class JavaXPropertyTest extends XAnnotatedElementTest { +public class JavaXPropertyTest extends XAnnotatedElementTestCase { private ReflectionManager factory = new JavaXFactory(); Deleted: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/XAnnotatedElement... [truncated message content] |