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