From: <hib...@li...> - 2006-05-31 16:37:09
|
Author: epbernard Date: 2006-05-31 12:37:03 -0400 (Wed, 31 May 2006) New Revision: 9970 Added: trunk/Hibernate3/src/org/hibernate/TypeMismatchException.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/Competitor.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/GetReferenceTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/MergeTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/Race.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/RemoveTest.java Modified: trunk/Hibernate3/src/org/hibernate/event/def/DefaultLoadEventListener.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java Log: HHH-1800 / EJB-189 raise exception when the id is not of the expected type Added: trunk/Hibernate3/src/org/hibernate/TypeMismatchException.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/TypeMismatchException.java 2006-05-31 15:31:49 UTC (rev 9969) +++ trunk/Hibernate3/src/org/hibernate/TypeMismatchException.java 2006-05-31 16:37:03 UTC (rev 9970) @@ -0,0 +1,21 @@ +//$Id: $ +package org.hibernate; + +/** + * Used when a user provided type does not match the expected one + * + * @author Emmanuel Bernard + */ +public class TypeMismatchException extends HibernateException { + public TypeMismatchException(Throwable root) { + super( root ); + } + + public TypeMismatchException(String s) { + super( s ); + } + + public TypeMismatchException(String string, Throwable root) { + super( string, root ); + } +} Modified: trunk/Hibernate3/src/org/hibernate/event/def/DefaultLoadEventListener.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/event/def/DefaultLoadEventListener.java 2006-05-31 15:31:49 UTC (rev 9969) +++ trunk/Hibernate3/src/org/hibernate/event/def/DefaultLoadEventListener.java 2006-05-31 16:37:03 UTC (rev 9970) @@ -9,8 +9,8 @@ import org.hibernate.LockMode; import org.hibernate.NonUniqueObjectException; import org.hibernate.ObjectDeletedException; -import org.hibernate.ObjectNotFoundException; import org.hibernate.PersistentObjectException; +import org.hibernate.TypeMismatchException; import org.hibernate.cache.CacheConcurrencyStrategy; import org.hibernate.cache.CacheKey; import org.hibernate.cache.entry.CacheEntry; @@ -71,7 +71,14 @@ event.getEntityClassName() ); } - + + Class idClass = persister.getIdentifierType().getReturnedClass(); + if ( idClass != null && ! idClass.isInstance( event.getEntityId() ) ) { + throw new TypeMismatchException( + "Provided id of the wrong type. Expected: " + idClass + ", got " + event.getEntityId() + ); + } + EntityKey keyToLoad = new EntityKey( event.getEntityId(), persister, source.getEntityMode() ); try { Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-05-31 15:31:49 UTC (rev 9969) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-05-31 16:37:03 UTC (rev 9970) @@ -40,6 +40,7 @@ import org.hibernate.StaleStateException; import org.hibernate.Transaction; import org.hibernate.UnresolvableObjectException; +import org.hibernate.TypeMismatchException; import org.hibernate.ejb.transaction.JoinableCMTTransaction; import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.engine.SessionImplementor; @@ -139,6 +140,9 @@ catch (MappingException e) { throw new IllegalArgumentException( e.getMessage(), e ); } + catch (TypeMismatchException e ) { + throw new IllegalArgumentException( e.getMessage(), e ); + } catch (ClassCastException e) { throw new IllegalArgumentException( e.getMessage(), e ); } @@ -165,6 +169,9 @@ catch (MappingException e) { throw new IllegalArgumentException( e.getMessage(), e ); } + catch (TypeMismatchException e ) { + throw new IllegalArgumentException( e.getMessage(), e ); + } catch (ClassCastException e) { throw new IllegalArgumentException( e.getMessage(), e ); } Added: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/Competitor.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/Competitor.java 2006-05-31 15:31:49 UTC (rev 9969) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/Competitor.java 2006-05-31 16:37:03 UTC (rev 9970) @@ -0,0 +1,22 @@ +//$Id: $ +package org.hibernate.ejb.test.emops; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.GeneratedValue; + +/** + * @author Emmanuel Bernard + */ +@Entity +public class Competitor { + @Id @GeneratedValue public Integer id; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } +} Added: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/GetReferenceTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/GetReferenceTest.java 2006-05-31 15:31:49 UTC (rev 9969) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/GetReferenceTest.java 2006-05-31 16:37:03 UTC (rev 9970) @@ -0,0 +1,35 @@ +//$Id: $ +package org.hibernate.ejb.test.emops; + +import javax.persistence.EntityManager; + +import org.hibernate.ejb.test.TestCase; + + +/** + * @author Emmanuel Bernard + */ +public class GetReferenceTest extends TestCase { + + public void testWrongIdType() throws Exception { + EntityManager em = factory.createEntityManager(); + try { + Competitor c = em.getReference( Competitor.class, new String("30") ); + fail("Expected IllegalArgumentException"); + } + catch (IllegalArgumentException e) { + //success + } + catch ( Exception e ) { + fail("Wrong exception: " + e ); + } + em.close(); + } + + public Class[] getAnnotatedClasses() { + return new Class[] { + Competitor.class, + Race.class + }; + } +} Added: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/MergeTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/MergeTest.java 2006-05-31 15:31:49 UTC (rev 9969) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/MergeTest.java 2006-05-31 16:37:03 UTC (rev 9970) @@ -0,0 +1,63 @@ +//$Id: $ +package org.hibernate.ejb.test.emops; + +import javax.persistence.EntityManager; + +import org.hibernate.ejb.test.TestCase; + +/** + * @author Emmanuel Bernard + */ +public class MergeTest extends TestCase { + public void testMergeWithIndexColumn() { + Race race = new Race(); + race.competitors.add( new Competitor() ); + race.competitors.add( new Competitor() ); + race.competitors.add( new Competitor() ); + EntityManager em = factory.createEntityManager(); + em.getTransaction().begin(); + em.persist( race ); + em.flush(); + em.clear(); + race.competitors.add( new Competitor() ); + race.competitors.remove( 2 ); + race = em.merge( race ); + em.flush(); + em.clear(); + race = em.find( Race.class, race.id ); + assertEquals( 3, race.competitors.size() ); + em.getTransaction().rollback(); + em.close(); + } + + public void testRemoveAndMerge() { + Race race = new Race(); + EntityManager em = factory.createEntityManager(); + em.getTransaction().begin(); + em.persist( race ); + em.flush(); + em.clear(); + race = em.find(Race.class, race.id ); + em.remove(race); + try { + race = em.merge( race ); + em.flush(); + fail("Should raise an IllegalArgumentException"); + } + catch (IllegalArgumentException e) { + //all good + } + catch (Exception e) { + fail("Should raise an IllegalArgumentException"); + } + em.getTransaction().rollback(); + em.close(); + } + + public Class[] getAnnotatedClasses() { + return new Class[] { + Race.class, + Competitor.class + }; + } +} Added: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/Race.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/Race.java 2006-05-31 15:31:49 UTC (rev 9969) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/Race.java 2006-05-31 16:37:03 UTC (rev 9970) @@ -0,0 +1,24 @@ +//$Id: $ +package org.hibernate.ejb.test.emops; + +import java.util.List; +import java.util.ArrayList; +import javax.persistence.Id; +import javax.persistence.GeneratedValue; +import javax.persistence.Entity; +import javax.persistence.OneToMany; +import javax.persistence.CascadeType; +import javax.persistence.FetchType; + +import org.hibernate.annotations.IndexColumn; + +/** + * @author Emmanuel Bernard + */ +@Entity +public class Race { + @Id @GeneratedValue public Integer id; + @IndexColumn( name="index" ) @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @org.hibernate.annotations.Cascade( { org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN }) + public List<Competitor> competitors = new ArrayList<Competitor>(); +} Added: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/RemoveTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/RemoveTest.java 2006-05-31 15:31:49 UTC (rev 9969) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/emops/RemoveTest.java 2006-05-31 16:37:03 UTC (rev 9970) @@ -0,0 +1,33 @@ +//$Id: $ +package org.hibernate.ejb.test.emops; + +import javax.persistence.EntityManager; + +import org.hibernate.ejb.test.TestCase; + +/** + * @author Emmanuel Bernard + */ +public class RemoveTest extends TestCase { + public void testMergeWithIndexColumn() { + Race race = new Race(); + race.competitors.add( new Competitor() ); + race.competitors.add( new Competitor() ); + race.competitors.add( new Competitor() ); + EntityManager em = factory.createEntityManager(); + em.getTransaction().begin(); + em.persist( race ); + em.flush(); + em.remove( race ); + em.flush(); + em.getTransaction().rollback(); + em.close(); + } + + public Class[] getAnnotatedClasses() { + return new Class[] { + Race.class, + Competitor.class + }; + } +} |