Author: epbernard
Date: 2006-04-25 16:56:10 -0400 (Tue, 25 Apr 2006)
New Revision: 9792
Modified:
trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java
trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Administration.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/BusTrip.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/metadata-complete.xml
trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml
Log:
XML overriding: support for associations
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-25 17:09:09 UTC (rev 9791)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-25 20:56:10 UTC (rev 9792)
@@ -15,16 +15,23 @@
import javax.persistence.AssociationOverrides;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.ColumnResult;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Embeddable;
+import javax.persistence.Embedded;
+import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EntityResult;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
import javax.persistence.ExcludeDefaultListeners;
import javax.persistence.ExcludeSuperclassListeners;
+import javax.persistence.FetchType;
import javax.persistence.FieldResult;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@@ -33,11 +40,18 @@
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.JoinTable;
+import javax.persistence.Lob;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.PrimaryKeyJoinColumns;
import javax.persistence.QueryHint;
@@ -50,18 +64,11 @@
import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
+import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Lob;
-import javax.persistence.Enumerated;
-import javax.persistence.Basic;
-import javax.persistence.FetchType;
-import javax.persistence.EnumType;
import javax.persistence.Version;
-import javax.persistence.Transient;
-import javax.persistence.Embedded;
-import javax.persistence.ManyToOne;
-import javax.persistence.JoinTable;
+import javax.persistence.OrderBy;
+import javax.persistence.MapKey;
import org.dom4j.Attribute;
import org.dom4j.Element;
@@ -136,6 +143,16 @@
annotationToXml.put( Transient.class, "transient");
annotationToXml.put( Basic.class, "basic");
annotationToXml.put( Embedded.class, "embedded");
+ annotationToXml.put( ManyToOne.class, "many-to-one");
+ annotationToXml.put( OneToOne.class, "one-to-one");
+ annotationToXml.put( OneToMany.class, "one-to-many");
+ annotationToXml.put( ManyToMany.class, "many-to-many");
+ annotationToXml.put( JoinTable.class, "join-table");
+ annotationToXml.put( JoinColumn.class, "join-column");
+ annotationToXml.put( JoinColumns.class, "join-column");
+ annotationToXml.put( MapKey.class, "map-key");
+ annotationToXml.put( OrderBy.class, "order-by");
+
}
private XMLContext xmlContext;
@@ -298,7 +315,7 @@
}
}
preCalculateElementsForProperty(tree);
- Transient transientAnn = getTransient();
+ Transient transientAnn = getTransient(defaults);
if (transientAnn != null) {
annotationList.add( transientAnn );
}
@@ -308,7 +325,10 @@
getEmbedded( annotationList, defaults );
getBasic( annotationList, defaults );
getVersion( annotationList, defaults );
- getManyToOne( annotationList, defaults );
+ getAssociation(ManyToOne.class, annotationList, defaults);
+ getAssociation(OneToOne.class, annotationList, defaults);
+ getAssociation(OneToMany.class, annotationList, defaults);
+ getAssociation(ManyToMany.class, annotationList, defaults);
}
this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] );
}
@@ -318,24 +338,166 @@
}
}
- private void getManyToOne(List<Annotation> annotationList, XMLContext.Default defaults) {
+ private JoinTable overridesDefaultsInJoinTable(XMLContext.Default defaults) {
+ //no element but might have some default or some annotation
+ final Class<JoinTable> annotationType = JoinTable.class;
+ if ( StringHelper.isNotEmpty( defaults.getCatalog() )
+ || StringHelper.isNotEmpty( defaults.getSchema() ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( annotationType );
+ if ( defaults.canUseJavaAnnotations() ) {
+ JoinTable table = super.getAnnotation( annotationType );
+ if ( table != null ) {
+ ad.setValue( "name", table.name() );
+ ad.setValue( "schema", table.schema() );
+ ad.setValue( "catalog", table.catalog() );
+ ad.setValue( "uniqueConstraints", table.uniqueConstraints() );
+ ad.setValue( "joinColumns", table.joinColumns() );
+ ad.setValue( "inverseJoinColumns", table.inverseJoinColumns() );
+ }
+ }
+ 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 );
+ }
+ else if ( defaults.canUseJavaAnnotations() ) {
+ return super.getAnnotation( annotationType );
+ }
+ else {
+ return null;
+ }
+ }
+
+ /*
+ * no partial overriding possible
+ */
+ private void getJoinTable(List<Annotation> annotationList, Element tree, XMLContext.Default defaults) {
+ Element subelement = tree == null ? null : tree.element( "join-table" );
+ final Class<JoinTable> annotationType = JoinTable.class;
+ if (subelement != null) {
+ //ignore java annotation, an element is defined
+ AnnotationDescriptor annotation = new AnnotationDescriptor( annotationType );
+ copyStringAttribute( annotation, subelement, "name", false );
+ copyStringAttribute( annotation, subelement, "catalog", false );
+ if ( StringHelper.isNotEmpty( defaults.getCatalog() )
+ && StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) ) {
+ annotation.setValue( "catalog", defaults.getCatalog() );
+ }
+ copyStringAttribute( annotation, subelement, "schema", false );
+ if ( StringHelper.isNotEmpty( defaults.getSchema() )
+ && StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) ) {
+ annotation.setValue( "schema", defaults.getSchema() );
+ }
+ buildUniqueConstraints( annotation, subelement );
+ annotation.setValue( "joinColumns", getJoinColumns( subelement, false ) );
+ annotation.setValue( "inverseJoinColumns", getJoinColumns( subelement, true ) );
+ annotationList.add( AnnotationFactory.create( annotation ) );
+ }
+ }
+
+ private void getAssociation(Class<? extends Annotation> annotationType, List<Annotation> annotationList, XMLContext.Default defaults) {
+ String xmlName = annotationToXml.get( annotationType );
for (Element element : elementsForProperty) {
- if ( "embedded".equals( element.getName() ) ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( Embedded.class );
+ if ( xmlName.equals( element.getName() ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( annotationType );
+ String className = element.attributeValue( "target-entity" );
+ if (className != null) {
+ Class clazz = null;
+ try {
+ clazz = ReflectHelper.classForName(
+ XMLContext.buildSafeClassName( className, defaults),
+ this.getClass()
+ );
+ }
+ catch( ClassNotFoundException e ) {
+ throw new AnnotationException( "Unable to find " + element.getPath() + "target-entity: " + className, e );
+ }
+ ad.setValue( "targetEntity", clazz);
+ }
+ getFetchType( ad, element );
+ getCascades( ad, element );
+ getJoinTable( annotationList, element, defaults );
+ buildJoinColumns( annotationList, element, defaults );
+ Annotation annotation = getPrimaryKeyJoinColumns( element, defaults );
+ if (annotation != null) annotationList.add( annotation );
+ copyBooleanAttribute( ad, element, "optional" );
+ copyStringAttribute( ad, element, "mapped-by", false );
+ getOrderBy( annotationList, element, defaults );
+ getMapKey( annotationList, element, defaults );
annotationList.add( AnnotationFactory.create( ad ) );
}
}
- if ( elementsForProperty.size() == 0 ) {
- Annotation annotation = super.getAnnotation( ManyToOne.class );
+ if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
+ Annotation annotation = super.getAnnotation( annotationType );
if (annotation != null) {
annotationList.add( annotation );
- annotation = super.getAnnotation( JoinTable.class );
+ annotation = overridesDefaultsInJoinTable( defaults );
if (annotation != null) annotationList.add( annotation );
+ annotation = super.getAnnotation( JoinColumn.class );
+ if (annotation != null) annotationList.add( annotation );
+ annotation = super.getAnnotation( JoinColumns.class );
+ if (annotation != null) annotationList.add( annotation );
+ annotation = super.getAnnotation( PrimaryKeyJoinColumn.class );
+ if (annotation != null) annotationList.add( annotation );
+ annotation = super.getAnnotation( PrimaryKeyJoinColumns.class );
+ if (annotation != null) annotationList.add( annotation );
+ annotation = super.getAnnotation( MapKey.class );
+ if (annotation != null) annotationList.add( annotation );
+ annotation = super.getAnnotation( OrderBy.class );
+ if (annotation != null) annotationList.add( annotation );
}
+ }
+ }
+ private void getOrderBy(List<Annotation> annotationList, Element element, XMLContext.Default defaults) {
+ Element subelement = element != null ? element.element( "order-by" ) : null;
+ if (subelement != null) {
+ String orderByString = subelement.getTextTrim();
+ AnnotationDescriptor ad = new AnnotationDescriptor( OrderBy.class );
+ if (StringHelper.isNotEmpty( orderByString ) ) ad.setValue( "value", orderByString );
+ annotationList.add( AnnotationFactory.create( ad ) );
}
}
+ private void getMapKey(List<Annotation> annotationList, Element element, XMLContext.Default defaults) {
+ Element subelement = element != null ? element.element( "map-key" ) : null;
+ if (subelement != null) {
+ String mapKeyString = subelement.attributeValue("name");
+ AnnotationDescriptor ad = new AnnotationDescriptor( MapKey.class );
+ if (StringHelper.isNotEmpty( mapKeyString ) ) ad.setValue( "name", mapKeyString );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ }
+ }
+
+ private void buildJoinColumns(List<Annotation> annotationList, Element element, XMLContext.Default defaults) {
+ JoinColumn[] joinColumns = getJoinColumns( element, false );
+ if (joinColumns.length > 0) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( JoinColumns.class );
+ ad.setValue( "value", joinColumns );
+ annotationList.add( AnnotationFactory.create(ad) );
+ }
+ }
+
+ private void getCascades(AnnotationDescriptor ad, Element element) {
+ List<Element> elements = element != null ? element.elements( "cascade" ) : new ArrayList<Element>(0);
+ List<CascadeType> cascades = new ArrayList<CascadeType>();
+ for (Element subelement : elements) {
+ if (subelement.element( "cascade-all") != null) cascades.add( CascadeType.ALL );
+ if (subelement.element( "cascade-persist") != null) cascades.add( CascadeType.PERSIST );
+ if (subelement.element( "cascade-merge") != null) cascades.add( CascadeType.MERGE );
+ if (subelement.element( "cascade-remove") != null) cascades.add( CascadeType.REMOVE );
+ if (subelement.element( "cascade-refresh") != null) cascades.add( CascadeType.REFRESH );
+ }
+ if (cascades.size() > 0) {
+ ad.setValue( "cascade", cascades.toArray( new CascadeType[ cascades.size() ] ) );
+ }
+ }
+
private void getEmbedded(List<Annotation> annotationList, XMLContext.Default defaults) {
for (Element element : elementsForProperty) {
if ( "embedded".equals( element.getName() ) ) {
@@ -343,20 +505,20 @@
annotationList.add( AnnotationFactory.create( ad ) );
}
}
- if ( elementsForProperty.size() == 0 ) {
+ if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
Embedded annotation = super.getAnnotation( Embedded.class );
if (annotation != null) annotationList.add( annotation );
}
}
- private Transient getTransient() {
+ private Transient getTransient(XMLContext.Default defaults) {
for (Element element : elementsForProperty) {
if ( "transient".equals( element.getName() ) ) {
AnnotationDescriptor ad = new AnnotationDescriptor( Transient.class );
return AnnotationFactory.create( ad );
}
}
- if ( elementsForProperty.size() == 0 ) {
+ if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
return super.getAnnotation( Transient.class );
}
else {
@@ -398,7 +560,7 @@
getLob(annotationList, element);
getEnumerated(annotationList, element);
AnnotationDescriptor basic = new AnnotationDescriptor( Basic.class );
- getFetchType( basic, element.attributeValue( "fetch" ) );
+ getFetchType( basic, element );
copyBooleanAttribute( basic, element, "optional" );
annotationList.add( AnnotationFactory.create( basic ) );
}
@@ -447,7 +609,8 @@
}
}
- private void getFetchType(AnnotationDescriptor descriptor, String fetchString) {
+ private void getFetchType(AnnotationDescriptor descriptor, Element element) {
+ String fetchString = element != null ? element.attributeValue( "fetch" ) : null;
if (fetchString != null) {
if ( "eager".equalsIgnoreCase( fetchString ) ) {
descriptor.setValue( "fetch", FetchType.EAGER);
@@ -456,7 +619,6 @@
descriptor.setValue( "fetch", FetchType.LAZY);
}
}
-
}
private void getEmbeddedId(List<Annotation> annotationList, XMLContext.Default defaults) {
@@ -638,15 +800,17 @@
for (Element current : subelements) {
AnnotationDescriptor override = new AnnotationDescriptor( AssociationOverride.class );
copyStringAttribute( override, current, "name", true );
- override.setValue( "joinColumns", getJoinColumns( current ) );
+ override.setValue( "joinColumns", getJoinColumns( current, false ) );
overrides.add( (AssociationOverride) AnnotationFactory.create( override ) );
}
}
return overrides;
}
- private JoinColumn[] getJoinColumns(Element element) {
- List<Element> subelements = element != null ? element.elements( "join-column" ) : null;
+ private JoinColumn[] getJoinColumns(Element element, boolean isInverse) {
+ List<Element> subelements = element != null ?
+ element.elements( isInverse ? "inverse-join-column" : "join-column" ) :
+ null;
List<JoinColumn> joinColumns = new ArrayList<JoinColumn>();
if ( subelements != null) {
for (Element subelement : subelements) {
@@ -800,7 +964,7 @@
}
private SqlResultSetMappings getSqlResultSetMappings(Element tree, XMLContext.Default defaults) {
- List<SqlResultSetMapping> results = (List<SqlResultSetMapping>) buildSqlResultsetMappings( tree );
+ List<SqlResultSetMapping> results = (List<SqlResultSetMapping>) buildSqlResultsetMappings( tree, defaults );
if ( defaults.canUseJavaAnnotations() ) {
SqlResultSetMapping annotation = super.getAnnotation( SqlResultSetMapping.class );
addSqlResultsetMappingIfNeeded( annotation, results );
@@ -821,7 +985,7 @@
}
}
- private List<SqlResultSetMapping> buildSqlResultsetMappings(Element element) {
+ private 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>();
@@ -839,7 +1003,10 @@
throw new AnnotationException("<entity-result> without entity-class. " + SCHEMA_VALIDATION);
Class clazz = null;
try {
- clazz = ReflectHelper.classForName( clazzName, this.getClass() );
+ clazz = ReflectHelper.classForName(
+ XMLContext.buildSafeClassName(clazzName, defaults),
+ this.getClass()
+ );
}
catch( ClassNotFoundException e ) {
throw new AnnotationException( "Unable to find entity-class: " + clazzName, e );
@@ -1161,7 +1328,10 @@
AnnotationDescriptor ad = new AnnotationDescriptor( IdClass.class );
Class clazz = null;
try {
- clazz = ReflectHelper.classForName( attr.getValue(), this.getClass() );
+ clazz = ReflectHelper.classForName(
+ XMLContext.buildSafeClassName(attr.getValue(), defaults),
+ this.getClass()
+ );
}
catch( ClassNotFoundException e ) {
throw new AnnotationException( "Unable to find id-class: " + attr.getValue(), e );
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-04-25 17:09:09 UTC (rev 9791)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-04-25 20:56:10 UTC (rev 9792)
@@ -102,6 +102,10 @@
return className;
}
+ public static String buildSafeClassName(String className, XMLContext.Default defaults) {
+ return buildSafeClassName( className, defaults.getPackageName() );
+ }
+
public Default getDefault(String className) {
Default xmlDefault = new Default();
xmlDefault.override( globalDefaults );
Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Administration.java
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Administration.java 2006-04-25 17:09:09 UTC (rev 9791)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Administration.java 2006-04-25 20:56:10 UTC (rev 9792)
@@ -6,6 +6,9 @@
import javax.persistence.Table;
import javax.persistence.SecondaryTable;
import javax.persistence.Basic;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinColumns;
+import javax.persistence.JoinColumn;
/**
* @author Emmanuel Bernard
@@ -20,6 +23,8 @@
private String address;
private Integer version;
@Basic private String transientField;
+ @OneToOne @JoinColumns( { @JoinColumn(name="busNumber_fk"), @JoinColumn(name="busDriver_fk") } )
+ private BusTrip defaultBusTrip;
public String getAddress() {
return address;
Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/BusTrip.java
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/BusTrip.java 2006-04-25 17:09:09 UTC (rev 9791)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/BusTrip.java 2006-04-25 20:56:10 UTC (rev 9792)
@@ -2,6 +2,8 @@
package org.hibernate.test.reflection.java.xml;
import java.util.Date;
+import java.util.Map;
+import java.util.List;
import javax.persistence.Entity;
import javax.persistence.EmbeddedId;
@@ -14,6 +16,8 @@
private Availability status;
private byte[] serial;
private Date terminusTime;
+ private Map<String, SocialSecurityPhysicalAccount> players;
+ private List roads;
@EmbeddedId
public BusTripPk getId() {
Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-25 17:09:09 UTC (rev 9791)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-25 20:56:10 UTC (rev 9792)
@@ -44,6 +44,13 @@
import javax.persistence.Version;
import javax.persistence.Transient;
import javax.persistence.Embedded;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinColumns;
+import javax.persistence.OneToMany;
+import javax.persistence.MapKey;
+import javax.persistence.ManyToMany;
+import javax.persistence.JoinTable;
+import javax.persistence.OrderBy;
import junit.framework.TestCase;
import org.dom4j.DocumentException;
@@ -260,6 +267,41 @@
assertNotNull( reader.getAnnotation( Embedded.class ) );
}
+ public void testAssociationRelatedAnnotations() throws Exception {
+ XMLContext context = buildContext("org/hibernate/test/reflection/java/xml/orm.xml");
+
+ Field field = Administration.class.getDeclaredField( "defaultBusTrip" );
+ EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( OneToOne.class ) );
+ assertNull( reader.getAnnotation( JoinColumns.class ) );
+ assertNotNull( reader.getAnnotation( PrimaryKeyJoinColumns.class ) );
+ assertEquals( "pk", reader.getAnnotation( PrimaryKeyJoinColumns.class ).value()[0].name() );
+ assertEquals( 5, reader.getAnnotation( OneToOne.class ).cascade().length );
+ assertEquals( FetchType.LAZY, reader.getAnnotation( OneToOne.class ).fetch() );
+ assertEquals( "test", reader.getAnnotation( OneToOne.class ).mappedBy() );
+
+ context = buildContext("org/hibernate/test/reflection/java/xml/metadata-complete.xml");
+ field = BusTrip.class.getDeclaredField( "players" );
+ reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( OneToMany.class ) );
+ assertNotNull( reader.getAnnotation( JoinColumns.class ) );
+ assertEquals( 2, reader.getAnnotation( JoinColumns.class ).value().length );
+ assertEquals( "driver", reader.getAnnotation( JoinColumns.class ).value()[0].name() );
+ assertNotNull( reader.getAnnotation( MapKey.class ) );
+ assertEquals( "name", reader.getAnnotation( MapKey.class ).name() );
+
+ field = BusTrip.class.getDeclaredField( "roads" );
+ reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( ManyToMany.class ) );
+ assertNotNull( reader.getAnnotation( JoinTable.class ) );
+ assertEquals( "bus_road", reader.getAnnotation( JoinTable.class ).name() );
+ assertEquals( 2, reader.getAnnotation( JoinTable.class ).joinColumns().length );
+ assertEquals( 1, reader.getAnnotation( JoinTable.class ).inverseJoinColumns().length );
+ assertEquals( 2, reader.getAnnotation( JoinTable.class ).uniqueConstraints()[0].columnNames().length );
+ assertNotNull( reader.getAnnotation( OrderBy.class ) );
+ assertEquals( "maxSpeed", reader.getAnnotation( OrderBy.class ).value() );
+ }
+
private XMLContext buildContext(String ormfile) throws SAXException, DocumentException, IOException {
XMLHelper xmlHelper = new XMLHelper();
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/metadata-complete.xml
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/metadata-complete.xml 2006-04-25 17:09:09 UTC (rev 9791)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/metadata-complete.xml 2006-04-25 20:56:10 UTC (rev 9792)
@@ -39,6 +39,23 @@
<basic name="terminusTime" fetch="LAZY">
<temporal>TIMESTAMP</temporal>
</basic>
+ <one-to-many name="players">
+ <map-key name="name"/>
+ <join-column name="driver"/>
+ <join-column name="number"/>
+ </one-to-many>
+ <many-to-many name="roads" target-entity="Administration">
+ <order-by>maxSpeed</order-by>
+ <join-table name="bus_road">
+ <join-column name="driver"/>
+ <join-column name="number"/>
+ <inverse-join-column name="road_id"/>
+ <unique-constraint>
+ <column-name>driver</column-name>
+ <column-name>number</column-name>
+ </unique-constraint>
+ </join-table>
+ </many-to-many>
</attributes>
</entity>
<embeddable class="BusTripPk" access="FIELD">
Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-25 17:09:09 UTC (rev 9791)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-25 20:56:10 UTC (rev 9792)
@@ -36,6 +36,16 @@
<sequence-generator name="generator" sequence-name="seq"/>
</id>
<version name="version"/>
+ <one-to-one name="defaultBusTrip" fetch="LAZY" mapped-by="test">
+ <primary-key-join-column name="pk"/>
+ <cascade>
+ <cascade-all/>
+ <cascade-persist/>
+ <cascade-merge/>
+ <cascade-remove/>
+ <cascade-refresh/>
+ </cascade>
+ </one-to-one>
<transient name="transientField"/>
</attributes>
</entity>
|