[hibernate-commits] Hibernate SVN: r10451 - in trunk: Hibernate3/src/org/hibernate/engine HibernateExt/ejb/src/test/org/hibernate/ejb/test/cascade

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Sep 5 02:53:48 EDT 2006


Author: epbernard
Date: 2006-09-05 02:53:46 -0400 (Tue, 05 Sep 2006)
New Revision: 10451

Added:
   trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/cascade/FetchTest2.java
   trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/cascade/Soldier2.java
   trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/cascade/Troop2.java
Modified:
   trunk/Hibernate3/src/org/hibernate/engine/CascadingAction.java
Log:
EJB-221 TransientObjectException raised on proxies during persist_on_fllush.noCascade()

Modified: trunk/Hibernate3/src/org/hibernate/engine/CascadingAction.java
===================================================================
--- trunk/Hibernate3/src/org/hibernate/engine/CascadingAction.java	2006-09-04 10:54:02 UTC (rev 10450)
+++ trunk/Hibernate3/src/org/hibernate/engine/CascadingAction.java	2006-09-05 06:53:46 UTC (rev 10451)
@@ -11,6 +11,7 @@
 import org.hibernate.LockMode;
 import org.hibernate.ReplicationMode;
 import org.hibernate.TransientObjectException;
+import org.hibernate.proxy.HibernateProxy;
 import org.hibernate.persister.entity.EntityPersister;
 import org.hibernate.collection.PersistentCollection;
 import org.hibernate.event.EventSource;
@@ -344,7 +345,9 @@
 			if ( type.isEntityType() ) {
 				String childEntityName = ( ( EntityType ) type ).getAssociatedEntityName( session.getFactory() );
 
-				if ( ! isInManagedState( child, session ) && ForeignKeys.isTransient( childEntityName, child, null, session ) ) {
+				if ( ! isInManagedState( child, session )
+						&& ! ( child instanceof HibernateProxy ) //a proxy cannot be transient and it breaks ForeignKeys.isTransient
+						&& ForeignKeys.isTransient( childEntityName, child, null, session ) ) {
 					String parentEntiytName = persister.getEntityName();
 					String propertyName = persister.getPropertyNames()[propertyIndex];
 					throw new TransientObjectException(

Added: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/cascade/FetchTest2.java
===================================================================
--- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/cascade/FetchTest2.java	2006-09-04 10:54:02 UTC (rev 10450)
+++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/cascade/FetchTest2.java	2006-09-05 06:53:46 UTC (rev 10451)
@@ -0,0 +1,67 @@
+package org.hibernate.ejb.test.cascade;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+
+public class FetchTest2 extends TestCase {
+
+	public void testProxyTransientStuff() throws Exception {
+
+		EntityManager em = factory.createEntityManager();
+		em.getTransaction().begin();
+
+		Troop2 disney = new Troop2();
+		disney.setName( "Disney" );
+
+		Soldier2 mickey = new Soldier2();
+		mickey.setName( "Mickey" );
+		mickey.setTroop( disney );
+
+		em.persist( disney );
+		em.persist( mickey );
+
+		em.getTransaction().commit();
+		em.close();
+
+		em = factory.createEntityManager();
+		em.getTransaction().begin();
+
+		Soldier2 soldier = em.find( Soldier2.class, mickey.getId() );
+		soldier.getTroop().getId();
+		try {
+			em.flush();
+		}
+		catch (IllegalStateException e) {
+			fail( "Should not raise an exception" );
+		}
+
+		em.getTransaction().commit();
+		em.close();
+
+		em = factory.createEntityManager();
+		em.getTransaction().begin();
+
+		//load troop wo a proxy
+		disney = em.find( Troop2.class, disney.getId() );
+		soldier = em.find( Soldier2.class, mickey.getId() );
+
+		try {
+			em.flush();
+		}
+		catch (IllegalStateException e) {
+			fail( "Should not raise an exception" );
+		}
+		em.remove( soldier );
+		em.remove( disney );
+		em.getTransaction().commit();
+		em.close();
+	}
+
+	public Class[] getAnnotatedClasses() {
+		return new Class[]{
+				Troop2.class,
+				Soldier2.class
+		};
+	}
+}

Added: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/cascade/Soldier2.java
===================================================================
--- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/cascade/Soldier2.java	2006-09-04 10:54:02 UTC (rev 10450)
+++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/cascade/Soldier2.java	2006-09-05 06:53:46 UTC (rev 10451)
@@ -0,0 +1,62 @@
+package org.hibernate.ejb.test.cascade;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Soldier2 implements Serializable {
+	private Integer id;
+	private String name;
+	private Troop2 troop;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@ManyToOne(fetch = FetchType.LAZY)
+	@JoinColumn(name = "troop_fk")
+	public Troop2 getTroop() {
+		return troop;
+	}
+
+	public void setTroop(Troop2 troop) {
+		this.troop = troop;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Soldier2 ) ) return false;
+
+		final Soldier2 soldier = (Soldier2) o;
+
+		if ( !name.equals( soldier.name ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return name.hashCode();
+	}
+}

Added: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/cascade/Troop2.java
===================================================================
--- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/cascade/Troop2.java	2006-09-04 10:54:02 UTC (rev 10450)
+++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/cascade/Troop2.java	2006-09-05 06:53:46 UTC (rev 10451)
@@ -0,0 +1,40 @@
+package org.hibernate.ejb.test.cascade;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Troop2 implements Serializable {
+
+	/* FAILS: */
+	@Id
+	@GeneratedValue
+	private Integer id;
+	private String name;
+
+	/* WORKS:
+	@Id
+	@GeneratedValue
+	*/
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+}




More information about the hibernate-commits mailing list