|
From: <hib...@li...> - 2006-05-01 20:12:52
|
Author: epbernard
Date: 2006-05-01 16:12:39 -0400 (Mon, 01 May 2006)
New Revision: 9845
Added:
trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKeyManyToMany.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/GasKey.java
Modified:
trunk/HibernateExt/metadata/build.xml
trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.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/indexcoll/Atmosphere.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java
Log:
ANN-327 support Map<Entity, ...>
Modified: trunk/HibernateExt/metadata/build.xml
===================================================================
--- trunk/HibernateExt/metadata/build.xml 2006-05-01 19:07:55 UTC (rev 9844)
+++ trunk/HibernateExt/metadata/build.xml 2006-05-01 20:12:39 UTC (rev 9845)
@@ -120,6 +120,16 @@
</junit>
</target>
+ <target name="report">
+ <mkdir dir="test_output"/>
+ <junitreport todir="test_output">
+ <fileset dir="test_output">
+ <include name="TEST-*.xml"/>
+ </fileset>
+ <report format="frames" todir="./report/html"/>
+ </junitreport>
+ </target>
+
<target name="jar" depends="compile" description="Build the distribution .jar file">
<mkdir dir="${classes.dir}/META-INF"/>
<manifest file="${classes.dir}/META-INF/MANIFEST.MF">
Modified: trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml
===================================================================
--- trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml 2006-05-01 19:07:55 UTC (rev 9844)
+++ trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml 2006-05-01 20:12:39 UTC (rev 9845)
@@ -1270,7 +1270,7 @@
<entry>(@org.hibernate.annotations.CollectionOfElements or
@OneToMany or @ManyToMany) and (nothing or
- @org.hibernate.annotations.MapKey for true map support, OR
+ @org.hibernate.annotations.MapKey/MapKeyManyToMany for true map support, OR
@javax.persistence.MapKey</entry>
</row>
</tbody>
@@ -2801,12 +2801,14 @@
semantic is applied</para>
</note>
- <para>Hibernate Annotations also supports true Map mappings (except
- Map<Entity, Entity>), if
+ <para>Hibernate Annotations also supports true Map mappings, if
<literal>@javax.persistence.MapKey</literal> is not set, hibernate
will map the key element or embeddable object in its/their own
columns. To overrides the default columns, you can use
- <literal>@org.hibernate.annotations.MapKey</literal>.</para>
+ <literal>@org.hibernate.annotations.MapKey</literal> if your key is a basic type
+ or an embeddable object, or you canh use
+ <literal>@org.hibernate.annotations.MapKey</literal> if your key is an entity.
+ </para>
<para>Hibernate Annotations also supports collections of core types
(Integer, String, Enums, ...), collections of embeddable objects and
Added: trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKeyManyToMany.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKeyManyToMany.java 2006-05-01 19:07:55 UTC (rev 9844)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKeyManyToMany.java 2006-05-01 20:12:39 UTC (rev 9845)
@@ -0,0 +1,21 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.persistence.JoinColumn;
+
+/**
+ * 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({ElementType.METHOD, ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MapKeyManyToMany {
+ JoinColumn[] joinColumns() default {};
+}
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-05-01 19:07:55 UTC (rev 9844)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-05-01 20:12:39 UTC (rev 9845)
@@ -85,6 +85,7 @@
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
import org.hibernate.annotations.Where;
+import org.hibernate.annotations.MapKeyManyToMany;
import org.hibernate.cfg.annotations.CollectionBinder;
import org.hibernate.cfg.annotations.EntityBinder;
import org.hibernate.cfg.annotations.Nullability;
@@ -1351,6 +1352,14 @@
);
collectionBinder.setMapKeyColumns( mapColumns );
+ MapKeyManyToMany mapKeyManyToMany = property.getAnnotation( MapKeyManyToMany.class );
+ Ejb3JoinColumn[] mapJoinColumns = Ejb3JoinColumn.buildJoinColumns(
+ mapKeyManyToMany != null ? mapKeyManyToMany.joinColumns() : null,
+ null, entityBinder.getSecondaryTables(),
+ propertyHolder, wrappedInferredData.getPropertyName(), mappings
+ );
+ collectionBinder.setMapKeyManyToManyColumns( mapJoinColumns );
+
//potential element
collectionBinder.setEmbedded( property.isAnnotationPresent( Embedded.class ) );
collectionBinder.setElementColumns( elementColumns );
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java 2006-05-01 19:07:55 UTC (rev 9844)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java 2006-05-01 20:12:39 UTC (rev 9845)
@@ -107,6 +107,7 @@
private boolean ignoreNotFound;
private TableBinder tableBinder;
private Ejb3Column[] mapKeyColumns;
+ private Ejb3JoinColumn[] mapKeyManyToManyColumns;
public void setUpdatable(boolean updatable) {
this.updatable = updatable;
@@ -348,7 +349,7 @@
joinColumns,
inverseJoinColumns,
elementColumns,
- mapKeyColumns, isEmbedded,
+ mapKeyColumns, mapKeyManyToManyColumns, isEmbedded,
property, collType,
ignoreNotFound, oneToMany,
tableBinder, mappings
@@ -454,7 +455,7 @@
final Ejb3JoinColumn[] fkJoinColumns, final Ejb3JoinColumn[] keyColumns,
final Ejb3JoinColumn[] inverseColumns,
final Ejb3Column[] elementColumns,
- final Ejb3Column[] mapKeyColumns, final boolean isEmbedded,
+ final Ejb3Column[] mapKeyColumns, final Ejb3JoinColumn[] mapKeyManyToManyColumns, final boolean isEmbedded,
final XProperty property, final String collType,
final boolean ignoreNotFound, final boolean unique,
final TableBinder assocTableBinder, final ExtendedMappings mappings
@@ -1101,4 +1102,8 @@
public void setMapKeyColumns(Ejb3Column[] mapKeyColumns) {
this.mapKeyColumns = mapKeyColumns;
}
+
+ public void setMapKeyManyToManyColumns(Ejb3JoinColumn[] mapJoinColumns) {
+ this.mapKeyManyToManyColumns = mapJoinColumns;
+ }
}
\ 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-05-01 19:07:55 UTC (rev 9844)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ListBinder.java 2006-05-01 20:12:39 UTC (rev 9845)
@@ -53,7 +53,7 @@
final Ejb3JoinColumn[] fkJoinColumns, final Ejb3JoinColumn[] keyColumns,
final Ejb3JoinColumn[] inverseColumns,
final Ejb3Column[] elementColumns,
- Ejb3Column[] mapKeyColumns, final boolean isEmbedded,
+ Ejb3Column[] mapKeyColumns, final Ejb3JoinColumn[] mapKeyManyToManyColumns, final boolean isEmbedded,
final XProperty property, final String collType,
final boolean ignoreNotFound, final boolean unique,
final TableBinder assocTableBinder, final ExtendedMappings 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-05-01 19:07:55 UTC (rev 9844)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/MapBinder.java 2006-05-01 20:12:39 UTC (rev 9845)
@@ -55,7 +55,7 @@
final Ejb3JoinColumn[] fkJoinColumns, final Ejb3JoinColumn[] keyColumns,
final Ejb3JoinColumn[] inverseColumns,
final Ejb3Column[] elementColumns,
- final Ejb3Column[] mapKeyColumns, final boolean isEmbedded,
+ final Ejb3Column[] mapKeyColumns, final Ejb3JoinColumn[] mapKeyManyToManyColumns, final boolean isEmbedded,
final XProperty property, final String collType,
final boolean ignoreNotFound, final boolean unique,
final TableBinder assocTableBinder, final ExtendedMappings mappings
@@ -68,8 +68,8 @@
isEmbedded, property, unique, assocTableBinder, ignoreNotFound, mappings
);
bindKeyFromAssociationTable(
- collType, persistentClasses, mapKeyPropertyName, property, ignoreNotFound, isEmbedded, mappings,
- mapKeyColumns
+ collType, persistentClasses, mapKeyPropertyName, property, isEmbedded, mappings,
+ mapKeyColumns, mapKeyManyToManyColumns
);
}
};
@@ -77,7 +77,8 @@
private void bindKeyFromAssociationTable(
String collType, Map persistentClasses, String mapKeyPropertyName, XProperty property,
- boolean ignoreNotFound, boolean isEmbedded, ExtendedMappings mappings, Ejb3Column[] mapKeyColumns
+ boolean isEmbedded, ExtendedMappings mappings, Ejb3Column[] mapKeyColumns,
+ Ejb3JoinColumn[] mapKeyManyToManyColumns
) {
if ( mapKeyPropertyName != null ) {
PersistentClass associatedClass = (PersistentClass) persistentClasses.get( collType );
@@ -110,7 +111,7 @@
//make the second join non lazy
element.setFetchMode( FetchMode.JOIN );
element.setLazy( false );
- element.setIgnoreNotFound( ignoreNotFound );
+ //does not make sense for a map key element.setIgnoreNotFound( ignoreNotFound );
}
else {
XClass elementClass;
@@ -211,7 +212,7 @@
}
//FIXME pass the Index Entity JoinColumns
if ( isIndexOfEntities ) {
- //bindManytoManyInverseFk( collectionEntity, indexJoinColumns, element, unique, mappings );
+ bindManytoManyInverseFk( collectionEntity, mapKeyManyToManyColumns, element, true, mappings );
}
}
}
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-05-01 19:07:55 UTC (rev 9844)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java 2006-05-01 20:12:39 UTC (rev 9845)
@@ -9,6 +9,7 @@
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Column;
+import javax.persistence.JoinTable;
import org.hibernate.annotations.MapKey;
@@ -20,7 +21,12 @@
@Id
@GeneratedValue
public Integer id;
+
@ManyToMany(cascade = CascadeType.ALL)
@MapKey(columns = {@Column(name="gas_name")})
public Map<String, Gas> gases = new HashMap<String, Gas>();
+
+ @ManyToMany(cascade = CascadeType.ALL)
+ @JoinTable(name = "Gas_per_key")
+ public Map<GasKey, Gas> gasesPerKey = new HashMap<GasKey, Gas>();
}
Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/GasKey.java
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/GasKey.java 2006-05-01 19:07:55 UTC (rev 9844)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/GasKey.java 2006-05-01 20:12:39 UTC (rev 9845)
@@ -0,0 +1,21 @@
+//$Id: $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+@Entity
+public class GasKey {
+ @Id private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java 2006-05-01 19:07:55 UTC (rev 9844)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java 2006-05-01 20:12:39 UTC (rev 9845)
@@ -371,20 +371,23 @@
Session s = openSession();
Transaction tx = s.beginTransaction();
Atmosphere atm = new Atmosphere();
+ GasKey key = new GasKey();
+ key.setName( "O2" );
Gas o2 = new Gas();
o2.name = "oxygen";
atm.gases.put( "100%", o2 );
+ atm.gasesPerKey.put(key, o2);
+ s.persist( key );
s.persist( atm );
- tx.commit();
- s.close();
+ s.flush();
+ s.clear();
- s = openSession();
- tx = s.beginTransaction();
atm = (Atmosphere) s.get( Atmosphere.class, atm.id );
+ key = (GasKey) s.get( GasKey.class, key.getName() );
assertEquals( 1, atm.gases.size() );
assertEquals( o2.name, atm.gases.get( "100%" ).name );
- s.delete( atm );
- tx.commit();
+ assertEquals( o2.name, atm.gasesPerKey.get(key).name );
+ tx.rollback();
s.close();
}
@@ -409,7 +412,8 @@
Painting.class,
Atmosphere.class,
Gas.class,
- AlphabeticalDirectory.class
+ AlphabeticalDirectory.class,
+ GasKey.class
};
}
}
|