|
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>();
}
|