[hibernate-commits] Hibernate SVN: r10938 - in branches/Branch_3_2/HibernateExt/metadata/src: java/org/hibernate/annotations java/org/hibernate/cfg java/org/hibernate/cfg/annotations test/org/hibernate/test/annotations test/org/hibernate/test/annotations/target

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Thu Dec 7 00:21:22 EST 2006


Author: epbernard
Date: 2006-12-07 00:21:17 -0500 (Thu, 07 Dec 2006)
New Revision: 10938

Added:
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/annotations/Target.java
   branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/
   branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Brand.java
   branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Luggage.java
   branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/LuggageImpl.java
   branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Owner.java
   branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/OwnerImpl.java
   branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Size.java
   branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/SizeImpl.java
   branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/TargetTest.java
Modified:
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKey.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKeyManyToMany.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyInferredData.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/IdBagBinder.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/MapBinder.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java
Log:
ANN-395 ANN-422 support for target definition on regular properties and map keys

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKey.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKey.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKey.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -19,4 +19,9 @@
 @Retention(RUNTIME)
 public @interface MapKey {
 	Column[] columns() default {};
+	/**
+	 * Represent the key class in a Map
+	 * Only useful if the collection does not use generics
+	 */
+	Class targetElement() default void.class;
 }

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKeyManyToMany.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKeyManyToMany.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/annotations/MapKeyManyToMany.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -18,4 +18,9 @@
 @Retention(RetentionPolicy.RUNTIME)
 public @interface MapKeyManyToMany {
 	JoinColumn[] joinColumns() default {};
+	/**
+	 * Represent the key class in a Map
+	 * Only useful if the collection does not use generics
+	 */
+	Class targetEntity() default void.class;
 }

Added: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/annotations/Target.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/annotations/Target.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/annotations/Target.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -0,0 +1,17 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Define an explicit target,a voiding reflection and generics resolving
+ *
+ * @author Emmanuel Bernard
+ */
+ at java.lang.annotation.Target({ElementType.FIELD, ElementType.METHOD})
+ at Retention( RetentionPolicy.RUNTIME )
+public @interface Target {
+	Class value();
+}

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -88,6 +88,7 @@
 import org.hibernate.annotations.TypeDefs;
 import org.hibernate.annotations.Where;
 import org.hibernate.annotations.Index;
+import org.hibernate.annotations.Target;
 import org.hibernate.cfg.annotations.CollectionBinder;
 import org.hibernate.cfg.annotations.EntityBinder;
 import org.hibernate.cfg.annotations.Nullability;
@@ -962,24 +963,27 @@
 				.equals( void.class ) ) {
 			return true;
 		}
-		if ( p.isAnnotationPresent( OneToMany.class ) && !p.getAnnotation( OneToMany.class )
+		else if ( p.isAnnotationPresent( OneToMany.class ) && !p.getAnnotation( OneToMany.class )
 				.targetEntity()
 				.equals( void.class ) ) {
 			return true;
 		}
-		if ( p.isAnnotationPresent( ManyToOne.class ) && !p.getAnnotation( ManyToOne.class )
+		else if ( p.isAnnotationPresent( ManyToOne.class ) && !p.getAnnotation( ManyToOne.class )
 				.targetEntity()
 				.equals( void.class ) ) {
 			return true;
 		}
-		if ( p.isAnnotationPresent( ManyToMany.class ) && !p.getAnnotation( ManyToMany.class )
+		else if ( p.isAnnotationPresent( ManyToMany.class ) && !p.getAnnotation( ManyToMany.class )
 				.targetEntity()
 				.equals( void.class ) ) {
 			return true;
 		}
-		if (p.isAnnotationPresent( Type.class ) ) {
+		else if (p.isAnnotationPresent( Type.class ) ) {
 			return true;
 		}
+		else if ( p.isAnnotationPresent( Target.class ) ) {
+			return true;
+		}
 		return false;
 	}
 
@@ -988,7 +992,9 @@
 			String propertyAccessor, ExtendedMappings mappings
 	) {
 		boolean hasIdentifier = false;
-		PropertyData propertyAnnotatedElement = new PropertyInferredData( property, propertyAccessor );
+		PropertyData propertyAnnotatedElement = new PropertyInferredData(
+				property, propertyAccessor,
+				mappings.getReflectionManager() );
 		if ( ! mustBeSkipped( propertyAnnotatedElement.getProperty(), mappings ) ) {
 			/*
 			 * put element annotated by @Id in front

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyInferredData.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyInferredData.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyInferredData.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -2,9 +2,12 @@
 package org.hibernate.cfg;
 
 import org.hibernate.MappingException;
+import org.hibernate.AssertionFailure;
 import org.hibernate.annotations.AccessType;
+import org.hibernate.annotations.Target;
 import org.hibernate.reflection.XClass;
 import org.hibernate.reflection.XProperty;
+import org.hibernate.reflection.ReflectionManager;
 
 /**
  * Retrieve all inferred data from an annnoted element
@@ -16,13 +19,15 @@
 	private final String defaultAccess;
 
 	private final XProperty property;
+	private final ReflectionManager reflectionManager;
 
 	/**
 	 * Take the annoted element for lazy process
 	 */
-	public PropertyInferredData(XProperty property, String propertyAccessor) {
+	public PropertyInferredData(XProperty property, String propertyAccessor, ReflectionManager reflectionManager) {
 		this.property = property;
 		this.defaultAccess = propertyAccessor;
+		this.reflectionManager = reflectionManager;
 	}
 
 	public String getDefaultAccess() throws MappingException {
@@ -37,19 +42,29 @@
 	}
 
 	public XClass getPropertyClass() throws MappingException {
-		return property.getType();
+		if ( property.isAnnotationPresent( Target.class ) ) {
+			return reflectionManager.toXClass( property.getAnnotation( Target.class ).value() );
+		}
+		else {
+			return property.getType();
+		}
 	}
 
 	public XClass getClassOrElement() throws MappingException {
-		return property.getClassOrElementClass();
+		if ( property.isAnnotationPresent( Target.class ) ) {
+			return reflectionManager.toXClass( property.getAnnotation( Target.class ).value() );
+		}
+		else {
+			return property.getClassOrElementClass();
+		}
 	}
 
 	public String getClassOrElementName() throws MappingException {
-		return property.getClassOrElementClass().getName();
+		return getClassOrElement().getName();
 	}
 
 	public String getTypeName() throws MappingException {
-		return property.getType().getName();
+		return getPropertyClass().getName();
 	}
 
 	public XProperty getProperty() {

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/IdBagBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/IdBagBinder.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/IdBagBinder.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -45,7 +45,8 @@
 			SimpleValueBinder simpleValue = new SimpleValueBinder();
 
 			PropertyData propertyData = new WrappedInferredData(
-					new PropertyInferredData(property, null), //default access should not be useful
+					new PropertyInferredData(property, null, //default access should not be useful
+							mappings.getReflectionManager() ),
 					"id" );
 			Ejb3Column[] idColumns = Ejb3Column.buildColumnFromAnnotation(
 					collectionIdAnn.columns(),

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/MapBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/MapBinder.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/MapBinder.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -7,11 +7,13 @@
 import java.util.Random;
 import javax.persistence.AttributeOverride;
 import javax.persistence.AttributeOverrides;
+import javax.persistence.MapKey;
 
 import org.hibernate.AnnotationException;
 import org.hibernate.AssertionFailure;
 import org.hibernate.FetchMode;
 import org.hibernate.MappingException;
+import org.hibernate.annotations.MapKeyManyToMany;
 import org.hibernate.cfg.AnnotatedClassType;
 import org.hibernate.cfg.AnnotationBinder;
 import org.hibernate.cfg.BinderHelper;
@@ -40,6 +42,7 @@
 import org.hibernate.mapping.Value;
 import org.hibernate.reflection.XClass;
 import org.hibernate.reflection.XProperty;
+import org.hibernate.reflection.ReflectionManager;
 import org.hibernate.sql.Template;
 import org.hibernate.util.StringHelper;
 
@@ -109,14 +112,30 @@
 		else {
 			//this is a true Map mapping
 			//TODO ugly copy/pastle from CollectionBinder.bindManyToManySecondPass
-			String mapKeyType = property.getMapKey().getName();
+			String mapKeyType;
+			Class target = void.class;
+			/*
+			 * target has priority over reflection for the map key type
+			 */
+			if ( property.isAnnotationPresent( org.hibernate.annotations.MapKey.class ) ) {
+				ReflectionManager reflectionManager = mappings.getReflectionManager();
+				target = property.getAnnotation( org.hibernate.annotations.MapKey.class ).targetElement();
+			}
+			else if ( property.isAnnotationPresent( MapKeyManyToMany.class ) ) {
+				target = property.getAnnotation( MapKeyManyToMany.class ).targetEntity();
+			}
+			if ( ! void.class.equals( target ) ) {
+				mapKeyType = target.getName();
+			}
+			else {
+				mapKeyType = property.getMapKey().getName();
+			}
 			PersistentClass collectionEntity = (PersistentClass) persistentClasses.get( mapKeyType );
 			boolean isIndexOfEntities = collectionEntity != null;
 			ManyToOne element = null;
 			org.hibernate.mapping.Map mapValue = (org.hibernate.mapping.Map) this.collection;
 			if ( isIndexOfEntities ) {
-				element =
-						new ManyToOne( mapValue.getCollectionTable() );
+				element = new ManyToOne( mapValue.getCollectionTable() );
 				mapValue.setIndex( element );
 				element.setReferencedEntityName( mapKeyType );
 				//element.setFetchMode( fetchMode );

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -83,10 +83,10 @@
 		if ( property.isAnnotationPresent( Temporal.class ) ) {
 			Temporal ann = property.getAnnotation( Temporal.class );
 			boolean isDate;
-			if ( mappings.getReflectionManager().equals( property.getType(), Date.class ) ) {
+			if ( mappings.getReflectionManager().equals( returnedClassOrElement, Date.class ) ) {
 				isDate = true;
 			}
-			else if ( mappings.getReflectionManager().equals( property.getType(), Calendar.class ) ) {
+			else if ( mappings.getReflectionManager().equals( returnedClassOrElement, Calendar.class ) ) {
 				isDate = false;
 			}
 			else {

Added: branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Brand.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Brand.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Brand.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -0,0 +1,56 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+import java.util.Map;
+import java.util.HashMap;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.ManyToMany;
+
+import org.hibernate.annotations.MapKey;
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.MapKeyManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Brand {
+	@Id
+	@GeneratedValue
+	private Long id;
+
+	@ManyToMany(targetEntity = LuggageImpl.class)
+	@MapKey(targetElement = SizeImpl.class)
+	private Map<Size, Luggage> luggagesBySize = new HashMap<Size, Luggage>();
+
+	@CollectionOfElements(targetElement = SizeImpl.class)
+	@MapKeyManyToMany(targetEntity = LuggageImpl.class)
+	private Map<Luggage, Size> sizePerLuggage = new HashMap<Luggage, Size>();
+
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Map<Size, Luggage> getLuggagesBySize() {
+		return luggagesBySize;
+	}
+
+	public void setLuggagesBySize(Map<Size, Luggage> luggagesBySize) {
+		this.luggagesBySize = luggagesBySize;
+	}
+
+	public Map<Luggage, Size> getSizePerLuggage() {
+		return sizePerLuggage;
+	}
+
+	public void setSizePerLuggage(Map<Luggage, Size> sizePerLuggage) {
+		this.sizePerLuggage = sizePerLuggage;
+	}
+}

Added: branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Luggage.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Luggage.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Luggage.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -0,0 +1,17 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Luggage {
+	double getHeight();
+	double getWidth();
+
+	void setHeight(double height);
+	void setWidth(double width);
+
+	Owner getOwner();
+
+	void setOwner(Owner owner);
+}

Added: branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/LuggageImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/LuggageImpl.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/LuggageImpl.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -0,0 +1,57 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.ManyToOne;
+import javax.persistence.Embedded;
+
+import org.hibernate.annotations.Target;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class LuggageImpl implements Luggage {
+	private Long id;
+	private double height;
+	private double width;
+	private Owner owner;
+
+	@Embedded
+	@Target(OwnerImpl.class)
+	public Owner getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Owner owner) {
+		this.owner = owner;
+	}
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public double getHeight() {
+		return height;
+	}
+
+	public void setHeight(double height) {
+		this.height = height;
+	}
+
+	public double getWidth() {
+		return width;
+	}
+
+	public void setWidth(double width) {
+		this.width = width;
+	}
+}

Added: branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Owner.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Owner.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Owner.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -0,0 +1,12 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+import java.util.Map;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Owner {
+	String getName();
+	void setName(String name);
+}

Added: branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/OwnerImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/OwnerImpl.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/OwnerImpl.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -0,0 +1,24 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+import java.util.Map;
+import java.util.HashMap;
+import javax.persistence.Embeddable;
+import org.hibernate.annotations.MapKey;
+import javax.persistence.ManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class OwnerImpl implements Owner {
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Size.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Size.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/Size.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -0,0 +1,10 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Size {
+	String getName();
+	void setName(String name);
+}

Added: branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/SizeImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/SizeImpl.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/SizeImpl.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class SizeImpl implements Size {
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/TargetTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/TargetTest.java	2006-12-06 13:05:04 UTC (rev 10937)
+++ branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/target/TargetTest.java	2006-12-07 05:21:17 UTC (rev 10938)
@@ -0,0 +1,82 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TargetTest extends TestCase {
+
+	public void testTargetOnEmbedded() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Luggage l = new LuggageImpl();
+		l.setHeight( 12 );
+		l.setWidth( 12 );
+		Owner o = new OwnerImpl();
+		o.setName( "Emmanuel" );
+		l.setOwner( o );
+		s.persist( l );
+		s.flush();
+		s.clear();
+		l = (Luggage) s.get(LuggageImpl.class, ( (LuggageImpl) l).getId() );
+		assertEquals( "Emmanuel", l.getOwner().getName() );
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	public void testTargetOnMapKey() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Luggage l = new LuggageImpl();
+		l.setHeight( 12 );
+		l.setWidth( 12 );
+		Size size = new SizeImpl();
+		size.setName( "S" );
+		Owner o = new OwnerImpl();
+		o.setName( "Emmanuel" );
+		l.setOwner( o );
+		s.persist( l );
+		Brand b = new Brand();
+		s.persist( b );
+		b.getLuggagesBySize().put( size, l );
+		s.flush();
+		s.clear();
+		b = (Brand) s.get(Brand.class, b.getId() );
+		assertEquals( "S", b.getLuggagesBySize().keySet().iterator().next().getName() );
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	public void testTargetOnMapKeyManyToMany() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Luggage l = new LuggageImpl();
+		l.setHeight( 12 );
+		l.setWidth( 12 );
+		Size size = new SizeImpl();
+		size.setName( "S" );
+		Owner o = new OwnerImpl();
+		o.setName( "Emmanuel" );
+		l.setOwner( o );
+		s.persist( l );
+		Brand b = new Brand();
+		s.persist( b );
+		b.getSizePerLuggage().put( l, size );
+		s.flush();
+		s.clear();
+		b = (Brand) s.get(Brand.class, b.getId() );
+		assertEquals( 12d, b.getSizePerLuggage().keySet().iterator().next().getWidth() );
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				LuggageImpl.class,
+				Brand.class
+		};
+	}
+}




More information about the hibernate-commits mailing list