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
+ */
+(a)java.lang.annotation.Target({ElementType.FIELD, ElementType.METHOD})
+@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
+ */
+@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
+ */
+@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
+ */
+@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
+ */
+@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
+ };
+ }
+}