Author: epbernard
Date: 2006-04-16 00:31:43 -0400 (Sun, 16 Apr 2006)
New Revision: 9750
Added:
trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityNumber.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityPhysicalAccount.java
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/EJB3OverridenAnnotationReaderTest.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.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:
Support for id-class and inheritance xml overriding
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-15 22:46:15 UTC (rev 9749)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-04-16 04:31:43 UTC (rev 9750)
@@ -19,6 +19,9 @@
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.persistence.PrimaryKeyJoinColumns;
+import javax.persistence.IdClass;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
import org.dom4j.Attribute;
import org.dom4j.Element;
@@ -27,6 +30,8 @@
import org.hibernate.reflection.Filter;
import org.hibernate.reflection.java.xml.XMLContext;
import org.hibernate.util.StringHelper;
+import org.hibernate.util.ReflectHelper;
+import org.hibernate.AnnotationException;
/**
* Encapsulates the overriding of Java annotations from an EJB 3.0 descriptor.
@@ -56,6 +61,8 @@
annotationToXml.put( SecondaryTables.class, "secondary-table" );
annotationToXml.put( PrimaryKeyJoinColumn.class, "primary-key-join-column" );
annotationToXml.put( PrimaryKeyJoinColumns.class, "primary-key-join-column" );
+ annotationToXml.put( IdClass.class, "id-class" );
+ annotationToXml.put( Inheritance.class, "inheritance" );
}
private XMLContext xmlContext;
@@ -145,6 +152,10 @@
if ( current != null ) annotationList.add( current );
current = getPrimaryKeyJoinColumns( tree, defaults );
if ( current != null ) annotationList.add( current );
+ current = getIdClass( tree, defaults );
+ if ( current != null ) annotationList.add( current );
+ current = getInheritance( tree, defaults );
+ if ( current != null ) annotationList.add( current );
this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] );
}
else if ( propertyName != null ) {
@@ -157,9 +168,69 @@
}
}
+ private Inheritance getInheritance(Element tree, XMLContext.Default defaults) {
+ Element element = tree != null ? tree.element( "inheritance" ) : null;
+ if ( element != null ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( Inheritance.class );
+ Attribute attr = element.attribute( "strategy" );
+ InheritanceType strategy = InheritanceType.SINGLE_TABLE;
+ if (attr != null) {
+ String value = attr.getValue();
+ if ( "SINGLE_TABLE".equals( value ) ) {
+ strategy = InheritanceType.SINGLE_TABLE;
+ }
+ else if ( "JOINED".equals( value ) ) {
+ strategy = InheritanceType.JOINED;
+ }
+ else if ( "TABLE_PER_CLASS".equals( value ) ) {
+ strategy = InheritanceType.TABLE_PER_CLASS;
+ }
+ else {
+ throw new AnnotationException( "Unknown InheritanceType in XML, activate schema validation: " + value );
+ }
+ }
+ ad.setValue( "strategy", strategy );
+ return AnnotationFactory.create( ad );
+ }
+ else if ( defaults.canUseJavaAnnotations() ) {
+ return super.getAnnotation( Inheritance.class );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private IdClass getIdClass(Element tree, XMLContext.Default defaults) {
+ Element element = tree == null ? null : tree.element( "id-class" );
+ if (element != null) {
+ Attribute attr = element.attribute( "class" );
+ if ( attr != null ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( IdClass.class );
+ Class clazz = null;
+ try {
+ clazz = ReflectHelper.classForName( attr.getValue(), this.getClass() );
+ }
+ catch( ClassNotFoundException e ) {
+ throw new AnnotationException( "Unable to find id-class: " + attr.getValue(), e );
+ }
+ ad.setValue( "value", clazz );
+ return AnnotationFactory.create( ad );
+ }
+ else {
+ throw new AnnotationException("id-class without class, please ensure schema validation");
+ }
+ }
+ else if ( defaults.canUseJavaAnnotations() ) {
+ return super.getAnnotation( IdClass.class );
+ }
+ else {
+ return null;
+ }
+ }
+
private PrimaryKeyJoinColumns getPrimaryKeyJoinColumns(Element element, XMLContext.Default defaults) {
PrimaryKeyJoinColumn[] columns = buildPrimaryKeyJoinColumns( element );
- if (columns.length == 0 && ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ) {
+ if (columns.length == 0 && defaults.canUseJavaAnnotations() ) {
PrimaryKeyJoinColumn annotation = super.getAnnotation( PrimaryKeyJoinColumn.class );
if (annotation != null) {
columns = new PrimaryKeyJoinColumn[] { annotation };
@@ -181,13 +252,13 @@
private Entity getEntity(Element tree, XMLContext.Default defaults) {
if ( tree == null ) {
- return ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ? super.getAnnotation( Entity.class ) : null;
+ return defaults.canUseJavaAnnotations() ? super.getAnnotation( Entity.class ) : null;
}
else {
if ( "entity".equals( tree.getName() ) ) {
AnnotationDescriptor entity = new AnnotationDescriptor( Entity.class );
copyAttribute( entity, tree, "name" );
- if ( ! Boolean.TRUE.equals( defaults.getMetadataComplete() )
+ if ( defaults.canUseJavaAnnotations()
&& StringHelper.isEmpty( (String) entity.valueOf( "name" ) ) ) {
Entity javaAnn = super.getAnnotation( Entity.class );
if ( javaAnn != null ) entity.setValue( "name", javaAnn.name() );
@@ -202,9 +273,7 @@
private MappedSuperclass getMappedSuperclass(Element tree, XMLContext.Default defaults) {
if ( tree == null ) {
- return ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ? super.getAnnotation(
- MappedSuperclass.class
- ) : null;
+ return defaults.canUseJavaAnnotations() ? super.getAnnotation(MappedSuperclass.class) : null;
}
else {
if ( "mapped-superclass".equals( tree.getName() ) ) {
@@ -219,9 +288,7 @@
private Embeddable getEmbeddable(Element tree, XMLContext.Default defaults) {
if ( tree == null ) {
- return ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ? super.getAnnotation(
- Embeddable.class
- ) : null;
+ return defaults.canUseJavaAnnotations() ? super.getAnnotation(Embeddable.class) : null;
}
else {
if ( "embeddable".equals( tree.getName() ) ) {
@@ -241,7 +308,7 @@
if ( StringHelper.isNotEmpty( defaults.getCatalog() )
|| StringHelper.isNotEmpty( defaults.getSchema() ) ) {
AnnotationDescriptor annotation = new AnnotationDescriptor( Table.class );
- if ( ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ) {
+ if ( defaults.canUseJavaAnnotations() ) {
Table table = super.getAnnotation( Table.class );
if ( table != null ) {
annotation.setValue( "name", table.name() );
@@ -260,7 +327,7 @@
}
return AnnotationFactory.create( annotation );
}
- else if ( ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ) {
+ else if ( defaults.canUseJavaAnnotations() ) {
return super.getAnnotation( Table.class );
}
else {
@@ -312,7 +379,7 @@
* You can't have both secondary table in XML and Java,
* since there would be no way to "remove" a secondary table
*/
- if ( secondaryTables.size() == 0 && ! Boolean.TRUE.equals( defaults.getMetadataComplete() ) ) {
+ if ( secondaryTables.size() == 0 && defaults.canUseJavaAnnotations() ) {
SecondaryTable secTableAnn = super.getAnnotation( SecondaryTable.class );
overridesDefaultInSecondaryTable( secTableAnn, defaults, secondaryTables );
SecondaryTables secTablesAnn = super.getAnnotation( SecondaryTables.class );
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-15 22:46:15 UTC (rev 9749)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-04-16 04:31:43 UTC (rev 9750)
@@ -156,6 +156,10 @@
return metadataComplete;
}
+ public boolean canUseJavaAnnotations() {
+ return ! Boolean.TRUE.equals( metadataComplete );
+ }
+
protected void setMetadataComplete(Boolean metadataComplete) {
this.metadataComplete = metadataComplete;
}
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-15 22:46:15 UTC (rev 9749)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/EJB3OverridenAnnotationReaderTest.java 2006-04-16 04:31:43 UTC (rev 9750)
@@ -14,6 +14,9 @@
import javax.persistence.SecondaryTable;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.PrimaryKeyJoinColumns;
+import javax.persistence.IdClass;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
import junit.framework.TestCase;
import org.hibernate.util.XMLHelper;
@@ -59,12 +62,17 @@
assertEquals( "Default schema not taken into account", "myschema",
reader.getAnnotation( SecondaryTables.class ).value()[0].schema()
);
+ assertNotNull( reader.getAnnotation( Inheritance.class ) );
+ assertEquals( "inheritance strategy not overriden", InheritanceType.JOINED, reader.getAnnotation( Inheritance.class ).strategy() );
reader = new EJB3OverridenAnnotationReader(Competition.class, context);
assertNotNull( reader.getAnnotation( MappedSuperclass.class) );
reader = new EJB3OverridenAnnotationReader(TennisMatch.class, context);
assertNull( "Mutualize PKJC into PKJCs", reader.getAnnotation( PrimaryKeyJoinColumn.class) );
assertNotNull( reader.getAnnotation( PrimaryKeyJoinColumns.class) );
assertEquals( "PrimaryKeyJoinColumn overrden", "id", reader.getAnnotation( PrimaryKeyJoinColumns.class).value()[0].name() );
+ reader = new EJB3OverridenAnnotationReader(SocialSecurityPhysicalAccount.class, context);
+ assertNotNull( reader.getAnnotation( IdClass.class ) );
+ assertEquals( "id-class not used", SocialSecurityNumber.class, reader.getAnnotation( IdClass.class ).value() );
}
public void testEntityRelatedAnnotationsMetadataComplete() throws Exception {
@@ -82,11 +90,14 @@
assertEquals( "Overriding not taken into account", "mycatalog", reader.getAnnotation( Table.class ).catalog() );
assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTable.class ) );
assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTables.class ) );
+ assertNull( "Ignore Java annotation", reader.getAnnotation( Inheritance.class ) );
reader = new EJB3OverridenAnnotationReader(TennisMatch.class, context);
assertNull( reader.getAnnotation( PrimaryKeyJoinColumn.class) );
assertNull( reader.getAnnotation( PrimaryKeyJoinColumns.class) );
reader = new EJB3OverridenAnnotationReader(Competition.class, context);
assertNull( reader.getAnnotation( MappedSuperclass.class) );
+ reader = new EJB3OverridenAnnotationReader(SocialSecurityMoralAccount.class, context);
+ assertNull( reader.getAnnotation( IdClass.class ) );
}
private XMLContext buildContext(String ormfile) throws SAXException, DocumentException, IOException {
Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java 2006-04-15 22:46:15 UTC (rev 9749)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/Match.java 2006-04-16 04:31:43 UTC (rev 9750)
@@ -4,6 +4,8 @@
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.SecondaryTable;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
/**
* @author Emmanuel Bernard
@@ -11,5 +13,6 @@
@Entity
@Table(name="matchtable", schema = "matchschema")
@SecondaryTable(name="extendedMatch")
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Match extends Competition {
}
Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java 2006-04-15 22:46:15 UTC (rev 9749)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityMoralAccount.java 2006-04-16 04:31:43 UTC (rev 9750)
@@ -0,0 +1,15 @@
+//$Id: $
+package org.hibernate.test.reflection.java.xml;
+
+import javax.persistence.Entity;
+import javax.persistence.IdClass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+@Entity
+@IdClass(SocialSecurityNumber.class)
+public class SocialSecurityMoralAccount {
+ public String number;
+ public String countryCode;
+}
Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityNumber.java
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityNumber.java 2006-04-15 22:46:15 UTC (rev 9749)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityNumber.java 2006-04-16 04:31:43 UTC (rev 9750)
@@ -0,0 +1,33 @@
+//$Id: $
+package org.hibernate.test.reflection.java.xml;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+@Embeddable
+public class SocialSecurityNumber implements Serializable {
+ public String number;
+ public String countryCode;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final SocialSecurityNumber that = (SocialSecurityNumber) o;
+
+ if ( !countryCode.equals( that.countryCode ) ) return false;
+ if ( !number.equals( that.number ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = number.hashCode();
+ result = 29 * result + countryCode.hashCode();
+ return result;
+ }
+}
Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityPhysicalAccount.java
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityPhysicalAccount.java 2006-04-15 22:46:15 UTC (rev 9749)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/SocialSecurityPhysicalAccount.java 2006-04-16 04:31:43 UTC (rev 9750)
@@ -0,0 +1,13 @@
+//$Id: $
+package org.hibernate.test.reflection.java.xml;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+@Entity
+public class SocialSecurityPhysicalAccount {
+ public String number;
+ public String countryCode;
+}
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-15 22:46:15 UTC (rev 9749)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/metadata-complete.xml 2006-04-16 04:31:43 UTC (rev 9750)
@@ -18,4 +18,5 @@
</entity>
<entity class="Match">
</entity>
+ <entity class="SocialSecurityMoralAccount"/>
</entity-mappings>
\ No newline at end of file
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-15 22:46:15 UTC (rev 9749)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/orm.xml 2006-04-16 04:31:43 UTC (rev 9750)
@@ -28,8 +28,12 @@
</secondary-table>
</entity>
<entity class="Match">
+ <inheritance strategy="JOINED"/>
</entity>
<entity class="TennisMatch">
<primary-key-join-column name="id"/>
</entity>
+ <entity class="SocialSecurityPhysicalAccount">
+ <id-class class="org.hibernate.test.reflection.java.xml.SocialSecurityNumber"/>
+ </entity>
</entity-mappings>
\ No newline at end of file
|