From: <hib...@li...> - 2006-04-26 17:07:13
|
Author: epbernard Date: 2006-04-26 13:07:08 -0400 (Wed, 26 Apr 2006) New Revision: 9798 Added: trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKey.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/WrappedInferredData.java Modified: trunk/HibernateExt/metadata/build.xml trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolderBuilder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ListBinder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/MapBinder.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/collectionelement/Boy.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java Log: ANN-1 support for Map<Element, and Map<Embeddable, with customable columns through @org.hibernate.annotations.MapKey Modified: trunk/HibernateExt/metadata/build.xml =================================================================== --- trunk/HibernateExt/metadata/build.xml 2006-04-26 06:49:01 UTC (rev 9797) +++ trunk/HibernateExt/metadata/build.xml 2006-04-26 17:07:08 UTC (rev 9798) @@ -16,7 +16,7 @@ <!-- Name of project and version, used to create filenames --> <property name="Name" value="Hibernate Annotations"/> <property name="name" value="hibernate-annotations"/> - <property name="version" value="3.1beta9"/> + <property name="version" value="3.1.0.Beta10"/> <property name="javadoc.packagenames" value="org.hibernate.*"/> <property name="jdbc.dir" value="jdbc"/> <property name="copy.test" value="true"/> Added: trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKey.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKey.java 2006-04-26 06:49:01 UTC (rev 9797) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKey.java 2006-04-26 17:07:08 UTC (rev 9798) @@ -0,0 +1,22 @@ +//$Id: $ +package org.hibernate.annotations; + +import java.lang.annotation.Target; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.FIELD; +import javax.persistence.Column; + +/** + * Define the map key columns as an explicit column holding the map key + * This is completly different from {@link javax.persistence.MapKey} which use an existing column + * This annotation and {@link javax.persistence.MapKey} are mutually exclusive + * + * @author Emmanuel Bernard + */ +@Target({METHOD, FIELD}) +@Retention(RUNTIME) +public @interface MapKey { + Column[] columns() default {}; +} Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-04-26 06:49:01 UTC (rev 9797) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-04-26 17:07:08 UTC (rev 9798) @@ -1253,6 +1253,7 @@ collectionBinder.setPropertyAccessorName( inferredData.getDefaultAccess() ); Ejb3Column[] elementColumns = null; + PropertyData wrappedInferredData = new WrappedInferredData(inferredData, "element"); if ( property.isAnnotationPresent( Column.class ) || property.isAnnotationPresent( Formula.class ) ) { @@ -1263,7 +1264,7 @@ formulaAnn, nullability, propertyHolder, - inferredData, + wrappedInferredData, entityBinder.getSecondaryTables(), mappings ); @@ -1271,11 +1272,35 @@ else if ( property.isAnnotationPresent( Columns.class ) ) { Columns anns = property.getAnnotation( Columns.class ); elementColumns = Ejb3Column.buildColumnFromAnnotation( - anns.columns(), null, nullability, propertyHolder, inferredData, + anns.columns(), null, nullability, propertyHolder, wrappedInferredData, entityBinder.getSecondaryTables(), mappings ); } + else { + elementColumns = Ejb3Column.buildColumnFromAnnotation( + null, + null, + nullability, + propertyHolder, + wrappedInferredData, + entityBinder.getSecondaryTables(), + mappings + ); + } + org.hibernate.annotations.MapKey hibMapKeyAnn = property.getAnnotation( org.hibernate.annotations.MapKey.class ); + wrappedInferredData = new WrappedInferredData(inferredData, "key"); + Ejb3Column[] mapColumns = Ejb3Column.buildColumnFromAnnotation( + hibMapKeyAnn != null && hibMapKeyAnn.columns().length > 0 ? hibMapKeyAnn.columns() : null, + null, + Nullability.FORCED_NOT_NULL, + propertyHolder, + wrappedInferredData, + entityBinder.getSecondaryTables(), + mappings + ); + collectionBinder.setMapKeyColumns(mapColumns); + //potential element collectionBinder.setEmbedded( property.isAnnotationPresent( Embedded.class ) ); collectionBinder.setElementColumns( elementColumns ); Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolderBuilder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolderBuilder.java 2006-04-26 06:49:01 UTC (rev 9797) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolderBuilder.java 2006-04-26 17:07:08 UTC (rev 9798) @@ -58,5 +58,4 @@ ) { return buildPropertyHolder( null, persistentClass, joins, mappings ); } - } Added: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/WrappedInferredData.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/WrappedInferredData.java 2006-04-26 06:49:01 UTC (rev 9797) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/WrappedInferredData.java 2006-04-26 17:07:08 UTC (rev 9798) @@ -0,0 +1,48 @@ +//$Id: $ +package org.hibernate.cfg; + +import org.hibernate.reflection.XClass; +import org.hibernate.reflection.XProperty; +import org.hibernate.MappingException; +import org.hibernate.util.StringHelper; + +/** + * @author Emmanuel Bernard + */ +public class WrappedInferredData implements PropertyData { + private PropertyData wrappedInferredData; + private String propertyName; + + public XClass getClassOrElement() throws MappingException { + return wrappedInferredData.getClassOrElement(); + } + + public String getClassOrElementName() throws MappingException { + return wrappedInferredData.getClassOrElementName(); + } + + public String getDefaultAccess() { + return wrappedInferredData.getDefaultAccess(); + } + + public XProperty getProperty() { + return wrappedInferredData.getProperty(); + } + + public XClass getPropertyClass() throws MappingException { + return wrappedInferredData.getPropertyClass(); + } + + public String getPropertyName() throws MappingException { + return propertyName; + } + + public String getTypeName() throws MappingException { + return wrappedInferredData.getTypeName(); + } + + public WrappedInferredData(PropertyData inferredData, String suffix) { + this.wrappedInferredData = inferredData; + this.propertyName = StringHelper.qualify( inferredData.getPropertyName(), suffix ); + } +} Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java 2006-04-26 06:49:01 UTC (rev 9797) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java 2006-04-26 17:07:08 UTC (rev 9798) @@ -101,6 +101,7 @@ private XProperty property; private boolean ignoreNotFound; private TableBinder tableBinder; + private Ejb3Column[] mapKeyColumns; public void setUpdatable(boolean updatable) { this.updatable = updatable; @@ -329,7 +330,7 @@ joinColumns, inverseJoinColumns, elementColumns, - isEmbedded, + mapKeyColumns, isEmbedded, property, collType, fetchMode, ignoreNotFound, oneToMany, @@ -384,7 +385,7 @@ final Ejb3JoinColumn[] fkJoinColumns, final Ejb3JoinColumn[] keyColumns, final Ejb3JoinColumn[] inverseColumns, final Ejb3Column[] elementColumns, - final boolean isEmbedded, + final Ejb3Column[] mapKeyColumns, final boolean isEmbedded, final XProperty property, final String collType, final FetchMode fetchMode, final boolean ignoreNotFound, final boolean unique, final TableBinder assocTableBinder, final ExtendedMappings mappings @@ -801,7 +802,7 @@ holder = PropertyHolderBuilder.buildPropertyHolder( collValue, - collValue.getRole(), + collValue.getRole() + "element", elementClass, property, mappings ); @@ -975,4 +976,8 @@ public void setIgnoreNotFound(boolean ignoreNotFound) { this.ignoreNotFound = ignoreNotFound; } + + public void setMapKeyColumns(Ejb3Column[] mapKeyColumns) { + this.mapKeyColumns = mapKeyColumns; + } } \ No newline at end of file Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ListBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ListBinder.java 2006-04-26 06:49:01 UTC (rev 9797) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ListBinder.java 2006-04-26 17:07:08 UTC (rev 9798) @@ -18,7 +18,6 @@ import org.hibernate.cfg.SecondPass; import org.hibernate.mapping.Collection; import org.hibernate.mapping.IndexBackref; -import org.hibernate.mapping.IndexedCollection; import org.hibernate.mapping.List; import org.hibernate.mapping.OneToMany; import org.hibernate.mapping.PersistentClass; @@ -55,7 +54,7 @@ final Ejb3JoinColumn[] fkJoinColumns, final Ejb3JoinColumn[] keyColumns, final Ejb3JoinColumn[] inverseColumns, final Ejb3Column[] elementColumns, - final boolean isEmbedded, + Ejb3Column[] mapKeyColumns, final boolean isEmbedded, final XProperty property, final String collType, final FetchMode fetchMode, final boolean ignoreNotFound, final boolean unique, final TableBinder assocTableBinder, final ExtendedMappings mappings @@ -76,7 +75,7 @@ if ( indexColumn.isImplicit() == false ) { PropertyHolder valueHolder = PropertyHolderBuilder.buildPropertyHolder( this.collection, - IndexedCollection.DEFAULT_INDEX_COLUMN_NAME, + this.collection.getRole() + "key", (XClass) null, (XProperty) null, mappings ); Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/MapBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/MapBinder.java 2006-04-26 06:49:01 UTC (rev 9797) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/MapBinder.java 2006-04-26 17:07:08 UTC (rev 9798) @@ -55,7 +55,7 @@ final Ejb3JoinColumn[] fkJoinColumns, final Ejb3JoinColumn[] keyColumns, final Ejb3JoinColumn[] inverseColumns, final Ejb3Column[] elementColumns, - final boolean isEmbedded, + final Ejb3Column[] mapKeyColumns, final boolean isEmbedded, final XProperty property, final String collType, final FetchMode fetchMode, final boolean ignoreNotFound, final boolean unique, final TableBinder assocTableBinder, final ExtendedMappings mappings @@ -68,7 +68,8 @@ isEmbedded, property, fetchMode, unique, assocTableBinder, ignoreNotFound, mappings ); bindKeyFromAssociationTable( - collType, persistentClasses, mapKeyPropertyName, property, ignoreNotFound, isEmbedded, mappings + collType, persistentClasses, mapKeyPropertyName, property, ignoreNotFound, isEmbedded, mappings, + mapKeyColumns ); } }; @@ -76,7 +77,7 @@ private void bindKeyFromAssociationTable( String collType, Map persistentClasses, String mapKeyPropertyName, XProperty property, - boolean ignoreNotFound, boolean isEmbedded, ExtendedMappings mappings + boolean ignoreNotFound, boolean isEmbedded, ExtendedMappings mappings, Ejb3Column[] mapKeyColumns ) { if ( mapKeyPropertyName != null ) { PersistentClass associatedClass = (PersistentClass) persistentClasses.get( collType ); @@ -134,7 +135,7 @@ holder = PropertyHolderBuilder.buildPropertyHolder( mapValue, - mapValue.getRole(), + mapValue.getRole() + "key", elementClass, property, mappings ); @@ -184,7 +185,8 @@ elementBinder.setMappings( mappings ); elementBinder.setReturnedClassName( mapKeyType ); //FIXME get the columns from an annotation - Ejb3Column[] elementColumns = null; + + Ejb3Column[] elementColumns = mapKeyColumns; if ( elementColumns == null || elementColumns.length == 0 ) { elementColumns = new Ejb3Column[1]; Ejb3Column column = new Ejb3Column(); Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/collectionelement/Boy.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/collectionelement/Boy.java 2006-04-26 06:49:01 UTC (rev 9797) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/collectionelement/Boy.java 2006-04-26 17:07:08 UTC (rev 9798) @@ -14,6 +14,7 @@ import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; +import javax.persistence.AttributeOverrides; import org.hibernate.annotations.CollectionOfElements; import org.hibernate.annotations.IndexColumn; @@ -22,6 +23,10 @@ * @author Emmanuel Bernard */ @Entity +@AttributeOverrides({ + @AttributeOverride( name="characters.element", column = @Column(name="character") ), + @AttributeOverride( name="scorePerNickName.element", column = @Column(name="fld_score") )} +) public class Boy { private Integer id; private String firstName; @@ -95,7 +100,7 @@ } @CollectionOfElements - @AttributeOverride(name = "serial", column = @Column(name = "serial_nbr")) + @AttributeOverride(name = "element.serial", column = @Column(name = "serial_nbr")) public Set<Toy> getFavoriteToys() { return favoriteToys; } Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java 2006-04-26 06:49:01 UTC (rev 9797) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java 2006-04-26 17:07:08 UTC (rev 9798) @@ -8,7 +8,10 @@ import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToMany; +import javax.persistence.Column; +import org.hibernate.annotations.MapKey; + /** * @author Emmanuel Bernard */ @@ -18,5 +21,6 @@ @GeneratedValue public Integer id; @ManyToMany(cascade = CascadeType.ALL) + @MapKey(columns = {@Column(name="gas_name")}) public Map<String, Gas> gases = new HashMap<String, Gas>(); } |