|
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
+ };
+ }
+}
|