|
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"/>
|