From: <hib...@li...> - 2006-05-02 21:46:24
|
Author: epbernard Date: 2006-05-02 17:46:17 -0400 (Tue, 02 May 2006) New Revision: 9856 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/java/org/hibernate/cfg/ExtendedMappings.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/QueryBinder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/ReflectionManager.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/xml/ejb3/orm.xml Log: ANN-323 xml defaults overriding has precedence over annotations Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-05-02 18:55:45 UTC (rev 9855) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-05-02 21:46:17 UTC (rev 9856) @@ -156,6 +156,52 @@ private static final Log log = LogFactory.getLog( AnnotationBinder.class ); + public static void bindDefaults(ExtendedMappings mappings) { + Map defaults = mappings.getReflectionManager().getDefaults(); + { + List<SequenceGenerator> anns = (List<SequenceGenerator>) defaults.get( SequenceGenerator.class ); + if (anns != null) { + for ( SequenceGenerator ann : anns ) { + IdGenerator idGen = buildIdGenerator(ann, mappings); + if (idGen != null) mappings.addDefaultGenerator( idGen ); + } + } + } + { + List<TableGenerator> anns = (List<TableGenerator>) defaults.get( TableGenerator.class ); + if (anns != null) { + for ( TableGenerator ann : anns ) { + IdGenerator idGen = buildIdGenerator(ann, mappings); + if (idGen != null) mappings.addDefaultGenerator( idGen ); + } + } + } + { + List<NamedQuery> anns = (List<NamedQuery>) defaults.get( NamedQuery.class ); + if (anns != null) { + for (NamedQuery ann : anns) { + QueryBinder.bindQuery(ann, mappings, true ); + } + } + } + { + List<NamedNativeQuery> anns = (List<NamedNativeQuery>) defaults.get( NamedNativeQuery.class ); + if (anns != null) { + for (NamedNativeQuery ann : anns) { + QueryBinder.bindNativeQuery(ann, mappings, true ); + } + } + } + { + List<SqlResultSetMapping> anns = (List<SqlResultSetMapping>) defaults.get( SqlResultSetMapping.class ); + if (anns != null) { + for (SqlResultSetMapping ann : anns) { + QueryBinder.bindSqlResultsetMapping(ann, mappings, true ); + } + } + } + } + public static void bindPackage(String packageName, ExtendedMappings mappings) { XPackage pckg = null; try { @@ -190,19 +236,19 @@ private static void bindQueries(XAnnotatedElement annotatedElement, ExtendedMappings mappings) { { SqlResultSetMapping ann = annotatedElement.getAnnotation( SqlResultSetMapping.class ); - QueryBinder.bindSqlResultsetMapping( ann, mappings ); + QueryBinder.bindSqlResultsetMapping( ann, mappings, false ); } { SqlResultSetMappings ann = annotatedElement.getAnnotation( SqlResultSetMappings.class ); if ( ann != null ) { for ( SqlResultSetMapping current : ann.value() ) { - QueryBinder.bindSqlResultsetMapping( current, mappings ); + QueryBinder.bindSqlResultsetMapping( current, mappings, false ); } } } { NamedQuery ann = annotatedElement.getAnnotation( NamedQuery.class ); - QueryBinder.bindQuery( ann, mappings ); + QueryBinder.bindQuery( ann, mappings, false ); } { org.hibernate.annotations.NamedQuery ann = annotatedElement.getAnnotation( @@ -212,7 +258,7 @@ } { NamedQueries ann = annotatedElement.getAnnotation( NamedQueries.class ); - QueryBinder.bindQueries( ann, mappings ); + QueryBinder.bindQueries( ann, mappings, false ); } { org.hibernate.annotations.NamedQueries ann = annotatedElement.getAnnotation( @@ -222,7 +268,7 @@ } { NamedNativeQuery ann = annotatedElement.getAnnotation( NamedNativeQuery.class ); - QueryBinder.bindNativeQuery( ann, mappings ); + QueryBinder.bindNativeQuery( ann, mappings, false ); } { org.hibernate.annotations.NamedNativeQuery ann = annotatedElement.getAnnotation( @@ -232,7 +278,7 @@ } { NamedNativeQueries ann = annotatedElement.getAnnotation( NamedNativeQueries.class ); - QueryBinder.bindNativeQueries( ann, mappings ); + QueryBinder.bindNativeQueries( ann, mappings, false ); } { org.hibernate.annotations.NamedNativeQueries ann = annotatedElement.getAnnotation( Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java 2006-05-02 18:55:45 UTC (rev 9855) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java 2006-05-02 21:46:17 UTC (rev 9856) @@ -63,6 +63,10 @@ private Map namedGenerators; private Map<String, Map<String, Join>> joins; private Map<String, AnnotatedClassType> classTypes; + private Set<String> defaultNamedQueryNames; + private Set<String> defaultNamedNativeQueryNames; + private Set<String> defaultSqlResulSetMappingNames; + private Set<String> defaultNamedGenerators; private Map<String, Properties> generatorTables; private Map<Table, List<String[]>> tableUniqueConstraints; private Map<String, String> mappedByResolver; @@ -76,6 +80,7 @@ private boolean inSecondPass = false; protected XMLHelper xmlHelper; private ReflectionManager reflectionManager; + private boolean isDefaultProcessed = false; public AnnotationConfiguration() { super(); @@ -164,6 +169,10 @@ namedQueries, namedSqlQueries, sqlResultSetMappings, + defaultNamedQueryNames, + defaultNamedNativeQueryNames, + defaultSqlResulSetMappingNames, + defaultNamedGenerators, imports, secondPasses, propertyReferences, @@ -203,6 +212,10 @@ joins = new HashMap<String, Map<String, Join>>(); classTypes = new HashMap<String, AnnotatedClassType>(); generatorTables = new HashMap<String, Properties>(); + defaultNamedQueryNames = new HashSet<String>(); + defaultNamedNativeQueryNames = new HashSet<String>(); + defaultSqlResulSetMappingNames = new HashSet<String>(); + defaultNamedGenerators = new HashSet<String>(); tableUniqueConstraints = new HashMap<Table, List<String[]>>(); mappedByResolver = new HashMap<String, String>(); propertyRefResolver = new HashMap<String, String>(); @@ -235,6 +248,14 @@ } annotatedClasses = tempAnnotatedClasses; } + + //process default values first + if ( ! isDefaultProcessed ) { + AnnotationBinder.bindDefaults( createExtendedMappings() ); + isDefaultProcessed = true; + } + + //process entities if ( precedence == null ) precedence = getProperties().getProperty( ARTEFACT ); if ( precedence == null ) precedence = DEFAULT_PRECEDENCE; StringTokenizer precedences = new StringTokenizer( precedence, ",; ", false ); Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/ExtendedMappings.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/ExtendedMappings.java 2006-05-02 18:55:45 UTC (rev 9855) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/ExtendedMappings.java 2006-05-02 21:46:17 UTC (rev 9856) @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.Set; import javax.persistence.Embeddable; import javax.persistence.Entity; import javax.persistence.MappedSuperclass; @@ -12,6 +13,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.MappingException; +import org.hibernate.engine.NamedQueryDefinition; +import org.hibernate.engine.NamedSQLQueryDefinition; +import org.hibernate.engine.ResultSetMappingDefinition; import org.hibernate.mapping.IdGenerator; import org.hibernate.mapping.Join; import org.hibernate.mapping.PersistentClass; @@ -38,10 +42,15 @@ private final Map<String, String> mappedByResolver; private final Map<String, String> propertyRefResolver; private final ReflectionManager reflectionManager; + private final Set<String> defaultNamedQueryNames; + private final Set<String> defaultNamedNativeQueryNames; + private final Set<String> defaultSqlResulSetMappingNames; + private final Set<String> defaultNamedGenerators; ExtendedMappings( Map classes, Map collections, Map tables, Map queries, Map sqlqueries, Map sqlResultSetMappings, - Map imports, + Set<String> defaultNamedQueryNames, Set<String> defaultNamedNativeQueryNames, + Set<String> defaultSqlResulSetMappingNames, Set<String> defaultNamedGenerators, Map imports, List secondPasses, List propertyReferences, NamingStrategy namingStrategy, Map typeDefs, Map filterDefinitions, Map namedGenerators, Map<String, Map<String, Join>> joins, Map<String, AnnotatedClassType> classTypes, Map extendsQueue, Map<String, TableDescription> tableNameBinding, @@ -79,11 +88,17 @@ this.mappedByResolver = mappedByResolver; this.propertyRefResolver = propertyRefResolver; this.reflectionManager = reflectionManager; + this.defaultNamedQueryNames = defaultNamedQueryNames; + this.defaultNamedNativeQueryNames = defaultNamedNativeQueryNames; + this.defaultSqlResulSetMappingNames = defaultSqlResulSetMappingNames; + this.defaultNamedGenerators = defaultNamedGenerators; } public void addGenerator(IdGenerator generator) throws MappingException { - Object old = namedGenerators.put( generator.getName(), generator ); - if ( old != null ) log.warn( "duplicate generator name: " + generator.getName() ); + if ( ! defaultNamedGenerators.contains( generator.getName() ) ) { + Object old = namedGenerators.put( generator.getName(), generator ); + if ( old != null ) log.warn( "duplicate generator name: " + generator.getName() ); + } } public void addJoins(PersistentClass persistentClass, Map<String, Join> joins) throws MappingException { @@ -202,4 +217,45 @@ public ReflectionManager getReflectionManager() { return reflectionManager; } + + public void addDefaultQuery(String name, NamedQueryDefinition query) { + super.addQuery(name, query); + defaultNamedQueryNames.add( name ); + } + + public void addDefaultSQLQuery(String name, NamedSQLQueryDefinition query) { + super.addSQLQuery(name, query); + defaultNamedNativeQueryNames.add( name ); + } + + public void addDefaultGenerator(IdGenerator idGen) { + this.addGenerator(idGen); + defaultNamedGenerators.add( idGen.getName() ); + + } + + public void addDefaultResultSetMapping(ResultSetMappingDefinition definition) { + if ( ! defaultSqlResulSetMappingNames.contains( definition.getName() ) + && super.getResultSetMapping( definition.getName() ) != null ) { + //FIXME overrides without clashing when resultSetMAppings visibility allows it + } + super.addResultSetMapping(definition); + defaultSqlResulSetMappingNames.add( definition.getName() ); + } + + @Override + public void addQuery(String name, NamedQueryDefinition query) throws MappingException { + if ( ! defaultNamedQueryNames.contains( name ) ) super.addQuery( name, query ); + } + + @Override + public void addResultSetMapping(ResultSetMappingDefinition definition) { + if ( ! defaultSqlResulSetMappingNames.contains( definition.getName() ) ) + super.addResultSetMapping( definition ); + } + + @Override + public void addSQLQuery(String name, NamedSQLQueryDefinition query) throws MappingException { + if ( ! defaultNamedNativeQueryNames.contains( name ) ) super.addSQLQuery( name, query ); + } } \ No newline at end of file Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/QueryBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/QueryBinder.java 2006-05-02 18:55:45 UTC (rev 9855) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/QueryBinder.java 2006-05-02 21:46:17 UTC (rev 9856) @@ -8,6 +8,7 @@ import javax.persistence.NamedQuery; import javax.persistence.QueryHint; import javax.persistence.SqlResultSetMapping; +import javax.persistence.SqlResultSetMappings; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -35,7 +36,7 @@ public abstract class QueryBinder { private static Log log = LogFactory.getLog( QueryBinder.class ); - public static void bindQuery(NamedQuery queryAnn, ExtendedMappings mappings) { + public static void bindQuery(NamedQuery queryAnn, ExtendedMappings mappings, boolean isDefault) { if ( queryAnn == null ) return; if ( AnnotationBinder.isDefault( queryAnn.name() ) ) { throw new AnnotationException( "A named query must have a name when used in class or package level" ); @@ -55,12 +56,17 @@ getString( queryName, "org.hibernate.comment", hints ), null ); - mappings.addQuery( queryAnn.name(), query ); + if (isDefault) { + mappings.addDefaultQuery( queryAnn.name(), query ); + } + else { + mappings.addQuery( queryAnn.name(), query ); + } if ( log.isInfoEnabled() ) log.info( "Binding Named query: " + queryAnn.name() + " => " + queryAnn.query() ); } - public static void bindNativeQuery(NamedNativeQuery queryAnn, ExtendedMappings mappings) { + public static void bindNativeQuery(NamedNativeQuery queryAnn, ExtendedMappings mappings, boolean isDefault) { if ( queryAnn == null ) return; //ResultSetMappingDefinition mappingDefinition = mappings.getResultSetMapping( queryAnn.resultSetMapping() ); if ( AnnotationBinder.isDefault( queryAnn.name() ) ) { @@ -113,7 +119,12 @@ else { throw new NotYetImplementedException( "Pure native scalar queries are not yet supported" ); } - mappings.addSQLQuery( queryAnn.name(), query ); + if (isDefault) { + mappings.addDefaultSQLQuery( queryAnn.name(), query ); + } + else { + mappings.addSQLQuery( queryAnn.name(), query ); + } if ( log.isInfoEnabled() ) { log.info( "Binding named native query: " + queryAnn.name() + " => " + queryAnn.query() ); } @@ -176,17 +187,17 @@ } } - public static void bindQueries(NamedQueries queriesAnn, ExtendedMappings mappings) { + public static void bindQueries(NamedQueries queriesAnn, ExtendedMappings mappings, boolean isDefault) { if ( queriesAnn == null ) return; for ( NamedQuery q : queriesAnn.value() ) { - bindQuery( q, mappings ); + bindQuery( q, mappings, isDefault ); } } - public static void bindNativeQueries(NamedNativeQueries queriesAnn, ExtendedMappings mappings) { + public static void bindNativeQueries(NamedNativeQueries queriesAnn, ExtendedMappings mappings, boolean isDefault) { if ( queriesAnn == null ) return; for ( NamedNativeQuery q : queriesAnn.value() ) { - bindNativeQuery( q, mappings ); + bindNativeQuery( q, mappings, isDefault ); } } @@ -271,10 +282,17 @@ } } - public static void bindSqlResultsetMapping(SqlResultSetMapping ann, ExtendedMappings mappings) { - mappings.addSecondPass( new ResultsetMappingSecondPass( ann, mappings ) ); + public static void bindSqlResultsetMappings(SqlResultSetMappings ann, ExtendedMappings mappings, boolean isDefault) { + if ( ann == null ) return; + for ( SqlResultSetMapping rs : ann.value() ) { + mappings.addSecondPass( new ResultsetMappingSecondPass( rs, mappings, true ) ); + } } + public static void bindSqlResultsetMapping(SqlResultSetMapping ann, ExtendedMappings mappings, boolean isDefault) { + mappings.addSecondPass( new ResultsetMappingSecondPass( ann, mappings, isDefault ) ); + } + private static CacheMode getCacheMode(String query, QueryHint[] hints) { for ( QueryHint hint : hints ) { if ( "org.hibernate.cacheMode".equals( hint.name() ) ) { Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java 2006-05-02 18:55:45 UTC (rev 9855) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java 2006-05-02 21:46:17 UTC (rev 9856) @@ -18,7 +18,7 @@ import org.hibernate.LockMode; import org.hibernate.MappingException; import org.hibernate.cfg.AnnotationBinder; -import org.hibernate.cfg.Mappings; +import org.hibernate.cfg.ExtendedMappings; import org.hibernate.cfg.QuerySecondPass; import org.hibernate.engine.ResultSetMappingDefinition; import org.hibernate.loader.custom.SQLQueryRootReturn; @@ -37,11 +37,13 @@ public class ResultsetMappingSecondPass implements QuerySecondPass { private static Log log = LogFactory.getLog( ResultsetMappingSecondPass.class ); private SqlResultSetMapping ann; - private Mappings mappings; + private ExtendedMappings mappings; + private boolean isDefault; - public ResultsetMappingSecondPass(SqlResultSetMapping ann, Mappings mappings) { + public ResultsetMappingSecondPass(SqlResultSetMapping ann, ExtendedMappings mappings, boolean isDefault) { this.ann = ann; this.mappings = mappings; + this.isDefault = isDefault; } public void doSecondPass(Map persistentClasses, Map inheritedMetas) throws MappingException { @@ -150,7 +152,12 @@ definition.addScalarQueryReturn( new SQLQueryScalarReturn( column.name(), null ) ); } - mappings.addResultSetMapping( definition ); + if (isDefault) { + mappings.addDefaultResultSetMapping( definition ); + } + else { + mappings.addResultSetMapping( definition ); + } } private List getFollowers(Iterator parentPropIter, String reducedName, String name) { Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/ReflectionManager.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/ReflectionManager.java 2006-05-02 18:55:45 UTC (rev 9855) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/ReflectionManager.java 2006-05-02 21:46:17 UTC (rev 9856) @@ -1,5 +1,7 @@ package org.hibernate.reflection; +import java.util.Map; + /** * The entry point to the reflection layer (a.k.a. the X* layer). * @@ -20,4 +22,6 @@ public XPackage packageForName(String packageName) throws ClassNotFoundException; public <T> boolean equals(XClass class1, Class<T> class2); + + public Map getDefaults(); } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-05-02 18:55:45 UTC (rev 9855) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-05-02 21:46:17 UTC (rev 9856) @@ -1132,7 +1132,7 @@ } } - private List<SqlResultSetMapping> buildSqlResultsetMappings(Element element, XMLContext.Default defaults) { + public static List<SqlResultSetMapping> buildSqlResultsetMappings(Element element, XMLContext.Default defaults) { if ( element == null ) return new ArrayList<SqlResultSetMapping>(); List resultsetElementList = element.elements( "sql-result-set-mapping" ); List<SqlResultSetMapping> resultsets = new ArrayList<SqlResultSetMapping>(); @@ -1153,7 +1153,7 @@ try { clazz = ReflectHelper.classForName( XMLContext.buildSafeClassName( clazzName, defaults ), - this.getClass() + EJB3OverridenAnnotationReader.class ); } catch (ClassNotFoundException e) { @@ -1276,7 +1276,7 @@ } } - private List buildNamedQueries(Element element, boolean isNative) { + public static List buildNamedQueries(Element element, boolean isNative) { if ( element == null ) return new ArrayList(); List namedQueryElementList = isNative ? element.elements( "named-native-query" ) : @@ -1316,26 +1316,7 @@ private TableGenerator getTableGenerator(Element tree, XMLContext.Default defaults) { Element element = tree != null ? tree.element( annotationToXml.get( TableGenerator.class ) ) : null; if ( element != null ) { - AnnotationDescriptor ad = new AnnotationDescriptor( TableGenerator.class ); - copyStringAttribute( ad, element, "name", false ); - copyStringAttribute( ad, element, "table", false ); - copyStringAttribute( ad, element, "catalog", false ); - copyStringAttribute( ad, element, "schema", false ); - copyStringAttribute( ad, element, "pk-column-name", false ); - copyStringAttribute( ad, element, "value-column-name", false ); - copyStringAttribute( ad, element, "pk-column-value", false ); - copyIntegerAttribute( ad, element, "initial-value" ); - copyIntegerAttribute( ad, element, "allocation-size" ); - buildUniqueConstraints( ad, element ); - if ( StringHelper.isEmpty( (String) ad.valueOf( "schema" ) ) - && StringHelper.isNotEmpty( defaults.getSchema() ) ) { - ad.setValue( "schema", defaults.getSchema() ); - } - if ( StringHelper.isEmpty( (String) ad.valueOf( "catalog" ) ) - && StringHelper.isNotEmpty( defaults.getCatalog() ) ) { - ad.setValue( "catalog", defaults.getCatalog() ); - } - return AnnotationFactory.create( ad ); + return buildTableGeneratorAnnotation( element, defaults ); } else if ( defaults.canUseJavaAnnotations() && super.isAnnotationPresent( TableGenerator.class ) ) { TableGenerator tableAnn = super.getAnnotation( TableGenerator.class ); @@ -1371,9 +1352,44 @@ } } + public static TableGenerator buildTableGeneratorAnnotation(Element element, XMLContext.Default defaults) { + AnnotationDescriptor ad = new AnnotationDescriptor( TableGenerator.class ); + copyStringAttribute( ad, element, "name", false ); + copyStringAttribute( ad, element, "table", false ); + copyStringAttribute( ad, element, "catalog", false ); + copyStringAttribute( ad, element, "schema", false ); + copyStringAttribute( ad, element, "pk-column-name", false ); + copyStringAttribute( ad, element, "value-column-name", false ); + copyStringAttribute( ad, element, "pk-column-value", false ); + copyIntegerAttribute( ad, element, "initial-value" ); + copyIntegerAttribute( ad, element, "allocation-size" ); + buildUniqueConstraints( ad, element ); + if ( StringHelper.isEmpty( (String) ad.valueOf( "schema" ) ) + && StringHelper.isNotEmpty( defaults.getSchema() ) ) { + ad.setValue( "schema", defaults.getSchema() ); + } + if ( StringHelper.isEmpty( (String) ad.valueOf( "catalog" ) ) + && StringHelper.isNotEmpty( defaults.getCatalog() ) ) { + ad.setValue( "catalog", defaults.getCatalog() ); + } + return AnnotationFactory.create( ad ); + } + private SequenceGenerator getSequenceGenerator(Element tree, XMLContext.Default defaults) { Element element = tree != null ? tree.element( annotationToXml.get( SequenceGenerator.class ) ) : null; if ( element != null ) { + return buildSequenceGeneratorAnnotation( element ); + } + else if ( defaults.canUseJavaAnnotations() ) { + return super.getAnnotation( SequenceGenerator.class ); + } + else { + return null; + } + } + + public static SequenceGenerator buildSequenceGeneratorAnnotation(Element element) { + if (element != null) { AnnotationDescriptor ad = new AnnotationDescriptor( SequenceGenerator.class ); copyStringAttribute( ad, element, "name", false ); copyStringAttribute( ad, element, "sequence-name", false ); @@ -1381,9 +1397,6 @@ copyIntegerAttribute( ad, element, "allocation-size" ); return AnnotationFactory.create( ad ); } - else if ( defaults.canUseJavaAnnotations() ) { - return super.getAnnotation( SequenceGenerator.class ); - } else { return null; } @@ -1705,7 +1718,7 @@ } } - private void buildUniqueConstraints(AnnotationDescriptor annotation, Element element) { + private static void buildUniqueConstraints(AnnotationDescriptor annotation, Element element) { List uniqueConstraintElementList = element.elements( "unique-constraint" ); UniqueConstraint[] uniqueConstraints = new UniqueConstraint[ uniqueConstraintElementList.size() ]; int ucIndex = 0; @@ -1744,7 +1757,7 @@ return pkJoinColumns; } - private void copyStringAttribute( + private static void copyStringAttribute( AnnotationDescriptor annotation, Element element, String attributeName, boolean mandatory ) { String attribute = element.attributeValue( attributeName ); @@ -1761,7 +1774,7 @@ } } - private void copyIntegerAttribute(AnnotationDescriptor annotation, Element element, String attributeName) { + private static void copyIntegerAttribute(AnnotationDescriptor annotation, Element element, String attributeName) { String attribute = element.attributeValue( attributeName ); if ( attribute != null ) { String annotationAttributeName = getJavaAttributeNameFromXMLOne( attributeName ); @@ -1778,7 +1791,7 @@ } } - private String getJavaAttributeNameFromXMLOne(String attributeName) { + private static String getJavaAttributeNameFromXMLOne(String attributeName) { StringBuilder annotationAttributeName = new StringBuilder( attributeName ); int index = annotationAttributeName.indexOf( WORD_SEPARATOR ); while ( index != -1 ) { @@ -1791,12 +1804,12 @@ return annotationAttributeName.toString(); } - private void copyStringElement(Element element, AnnotationDescriptor ad, String annotationAttribute) { + private static void copyStringElement(Element element, AnnotationDescriptor ad, String annotationAttribute) { String discr = element.getTextTrim(); ad.setValue( annotationAttribute, discr ); } - private void copyBooleanAttribute(AnnotationDescriptor descriptor, Element element, String attribute) { + private static void copyBooleanAttribute(AnnotationDescriptor descriptor, Element element, String attribute) { String attributeValue = element.attributeValue( attribute ); if ( StringHelper.isNotEmpty( attributeValue ) ) { String javaAttribute = getJavaAttributeNameFromXMLOne( attribute ); Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java 2006-05-02 18:55:45 UTC (rev 9855) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java 2006-05-02 21:46:17 UTC (rev 9856) @@ -3,11 +3,19 @@ import java.lang.reflect.Member; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; +import javax.persistence.NamedNativeQuery; +import javax.persistence.NamedQuery; +import javax.persistence.SequenceGenerator; +import javax.persistence.SqlResultSetMapping; +import javax.persistence.TableGenerator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.dom4j.Element; import org.hibernate.reflection.ReflectionManager; import org.hibernate.reflection.XClass; import org.hibernate.reflection.XMethod; @@ -32,6 +40,7 @@ private static Log log = LogFactory.getLog( JavaXFactory.class ); private XMLContext xmlContext; + private HashMap defaults; private static class TypeKey extends Pair<Type, TypeEnvironment> { TypeKey(Type t, TypeEnvironment context) { @@ -65,7 +74,7 @@ packagesToXPackages.clear(); xProperties.clear(); xMethods.clear(); - + defaults = null; } public XClass toXClass(Class clazz) { @@ -87,6 +96,59 @@ return getXAnnotatedElement( ReflectHelper.classForName( packageName + ".package-info" ).getPackage() ); } + public Map getDefaults() { + if (defaults == null) { + defaults = new HashMap(); + XMLContext.Default xmlDefaults = xmlContext.getDefault( null ); + for( Element element : xmlContext.getAllDocuments() ) { + List<Element> elements = element.elements( "sequence-generator" ); + List<SequenceGenerator> sequenceGenerators = (List<SequenceGenerator>) defaults.get(SequenceGenerator.class); + if (sequenceGenerators == null) { + sequenceGenerators = new ArrayList<SequenceGenerator>(); + defaults.put( SequenceGenerator.class, sequenceGenerators ); + } + for (Element subelement : elements) { + sequenceGenerators.add( EJB3OverridenAnnotationReader.buildSequenceGeneratorAnnotation( subelement ) ); + } + + elements = element.elements( "table-generator" ); + List<TableGenerator> tableGenerators = (List<TableGenerator>) defaults.get(TableGenerator.class); + if (tableGenerators == null) { + tableGenerators = new ArrayList<TableGenerator>(); + defaults.put( TableGenerator.class, tableGenerators ); + } + for (Element subelement : elements) { + tableGenerators.add( EJB3OverridenAnnotationReader.buildTableGeneratorAnnotation( subelement, xmlDefaults ) ); + } + + List<NamedQuery> namedQueries = (List<NamedQuery>) defaults.get(NamedQuery.class); + if (namedQueries == null) { + namedQueries = new ArrayList<NamedQuery>(); + defaults.put( NamedQuery.class, namedQueries ); + } + List<NamedQuery> currentNamedQueries = EJB3OverridenAnnotationReader.buildNamedQueries(element, false); + namedQueries.addAll( currentNamedQueries ); + + List<NamedNativeQuery> namedNativeQueries = (List<NamedNativeQuery>) defaults.get(NamedNativeQuery.class); + if (namedNativeQueries == null) { + namedNativeQueries = new ArrayList<NamedNativeQuery>(); + defaults.put( NamedNativeQuery.class, namedNativeQueries ); + } + List<NamedNativeQuery> currentNamedNativeQueries = EJB3OverridenAnnotationReader.buildNamedQueries(element, true); + namedNativeQueries.addAll( currentNamedNativeQueries ); + + List<SqlResultSetMapping> sqlResultSetMappings = (List<SqlResultSetMapping>) defaults.get(SqlResultSetMapping.class); + if (sqlResultSetMappings == null) { + sqlResultSetMappings = new ArrayList<SqlResultSetMapping>(); + defaults.put( SqlResultSetMapping.class, sqlResultSetMappings ); + } + List<SqlResultSetMapping> currentSqlResultSetMappings = EJB3OverridenAnnotationReader.buildSqlResultsetMappings(element, xmlDefaults); + sqlResultSetMappings.addAll( currentSqlResultSetMappings ); + } + } + return defaults; + } + XClass toXClass(Type t, final TypeEnvironment context) { return new TypeSwitch<XClass>() { @Override Modified: 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-05-02 18:55:45 UTC (rev 9855) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-05-02 21:46:17 UTC (rev 9856) @@ -20,6 +20,7 @@ private Default globalDefaults; private Map<String, Element> classOverriding = new HashMap<String, Element>(); private Map<String, Default> defaultsOverriding = new HashMap<String, Default>(); + private List<Element> defaultElements = new ArrayList<Element>(); /** * Add a document and return the list of added classes names @@ -65,6 +66,7 @@ entityMappingDefault.setCatalog( unitElement != null ? unitElement.getTextTrim() : null ); unitElement = root.element( "access" ); entityMappingDefault.setAccess( unitElement != null ? unitElement.getTextTrim() : null ); + defaultElements.add(root); List<String> addedClasses = new ArrayList<String>(); List<Element> entities = (List<Element>) root.elements( "entity" ); @@ -115,8 +117,10 @@ public Default getDefault(String className) { Default xmlDefault = new Default(); xmlDefault.override( globalDefaults ); - Default entityMappingOverriding = defaultsOverriding.get( className ); - xmlDefault.override( entityMappingOverriding ); + if (className != null) { + Default entityMappingOverriding = defaultsOverriding.get( className ); + xmlDefault.override( entityMappingOverriding ); + } return xmlDefault; } @@ -124,6 +128,10 @@ return classOverriding.get( className ); } + public List<Element> getAllDocuments() { + return defaultElements; + } + public static class Default { private String access; private String packageName; Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java 2006-05-02 18:55:45 UTC (rev 9855) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java 2006-05-02 21:46:17 UTC (rev 9856) @@ -22,12 +22,9 @@ model.setManufacturer( manufacturer ); manufacturer.getModels().add( model ); s.persist( model ); - tx.commit(); - s.close(); + s.flush(); + s.clear(); - s = openSession(); - tx = s.beginTransaction(); - model.setYear( new Date() ); manufacturer = (Manufacturer) s.get( Manufacturer.class, manufacturer.getId() ); List<Model> cars = s.getNamedQuery( "allModelsPerManufacturer" ) @@ -39,7 +36,7 @@ s.delete( manufacturer ); s.delete( car ); } - tx.commit(); + tx.rollback(); s.close(); } @@ -55,6 +52,19 @@ s.close(); } + public void testXmlDefaultOverriding() throws Exception { + Session s = openSession(); + Transaction tx = s.beginTransaction(); + Manufacturer manufacturer = new Manufacturer(); + s.persist( manufacturer ); + s.flush(); + s.clear(); + + assertEquals( 1, s.getNamedQuery( "manufacturer.findAll" ).list().size() ); + tx.rollback(); + s.close(); + } + protected Class[] getMappings() { return new Class[]{ CarModel.class, Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java 2006-05-02 18:55:45 UTC (rev 9855) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java 2006-05-02 21:46:17 UTC (rev 9856) @@ -6,11 +6,15 @@ import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToMany; +import javax.persistence.NamedQuery; +import javax.persistence.TableGenerator; /** * @author Emmanuel Bernard */ @Entity +@NamedQuery(name="manufacturer.findAll", query = "from Manufacturer where 1 = 2") +@TableGenerator(name="generator", table = "this is a broken name with select from and other SQL keywords") public class Manufacturer { private Integer id; private Set<Model> models = new HashSet<Model>(); Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/xml/ejb3/orm.xml =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/xml/ejb3/orm.xml 2006-05-02 18:55:45 UTC (rev 9855) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/xml/ejb3/orm.xml 2006-05-02 21:46:17 UTC (rev 9856) @@ -11,6 +11,10 @@ </persistence-unit-defaults> </persistence-unit-metadata> <package>org.hibernate.test.annotations.xml.ejb3</package> + <table-generator name="generator" table="table_id"/> + <named-query name="manufacturer.findAll"> + <query>select m from Manufacturer m</query> + </named-query> <entity class="Model" access="PROPERTY" name="ModelZ" metadata-complete="true"> <table name="ModelZ"> </table> @@ -18,7 +22,7 @@ <attributes> <id name="id"> <column name="fld_id"/> - <generated-value strategy="AUTO"/> + <generated-value strategy="TABLE" generator="generator"/> </id> <many-to-one name="manufacturer" fetch="LAZY"> <join-column name="manufacturer_pk"/> |