[hibernate-commits] Hibernate SVN: r18191 - in core/trunk: annotations/src/main/java/org/hibernate/cfg and 4 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Thu Dec 10 04:32:26 EST 2009


Author: epbernard
Date: 2009-12-10 04:32:25 -0500 (Thu, 10 Dec 2009)
New Revision: 18191

Added:
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/cascade/DetachAndContainsTest.java
Modified:
   core/trunk/annotations/src/main/java/org/hibernate/annotations/CascadeType.java
   core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java
   core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/reflection/JPAOverridenAnnotationReader.java
   core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cascade/CascadeTest.java
   core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cascade/Mouth.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/AbstractEntityManagerImpl.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/cascade/CascadeTest.java
Log:
HHH-4657 add support for DETACH

Modified: core/trunk/annotations/src/main/java/org/hibernate/annotations/CascadeType.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/annotations/CascadeType.java	2009-12-10 00:34:12 UTC (rev 18190)
+++ core/trunk/annotations/src/main/java/org/hibernate/annotations/CascadeType.java	2009-12-10 09:32:25 UTC (rev 18191)
@@ -37,5 +37,8 @@
 	REPLICATE,
 	DELETE_ORPHAN,
 	LOCK,
-	EVICT
+	/** @deprecated use DETACH */
+	@Deprecated
+	EVICT,
+	DETACH
 }

Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java	2009-12-10 00:34:12 UTC (rev 18190)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java	2009-12-10 09:32:25 UTC (rev 18191)
@@ -2518,6 +2518,9 @@
 					case REFRESH:
 						hibernateCascadeSet.add( CascadeType.REFRESH );
 						break;
+					case DETACH:
+						hibernateCascadeSet.add( CascadeType.DETACH );
+						break;
 				}
 			}
 		}
@@ -2565,6 +2568,7 @@
 					cascade.append( "," ).append( "replicate" );
 					break;
 				case EVICT:
+				case DETACH:
 					cascade.append( "," ).append( "evict" );
 					break;
 				case DELETE:

Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/reflection/JPAOverridenAnnotationReader.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/reflection/JPAOverridenAnnotationReader.java	2009-12-10 00:34:12 UTC (rev 18190)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/reflection/JPAOverridenAnnotationReader.java	2009-12-10 09:32:25 UTC (rev 18191)
@@ -810,6 +810,7 @@
 			if ( subelement.element( "cascade-merge" ) != null ) cascades.add( CascadeType.MERGE );
 			if ( subelement.element( "cascade-remove" ) != null ) cascades.add( CascadeType.REMOVE );
 			if ( subelement.element( "cascade-refresh" ) != null ) cascades.add( CascadeType.REFRESH );
+			if ( subelement.element( "cascade-detach" ) != null ) cascades.add( CascadeType.DETACH );
 		}
 		if ( Boolean.TRUE.equals( defaults.getCascadePersist() )
 				&& !cascades.contains( CascadeType.ALL ) && !cascades.contains( CascadeType.PERSIST ) ) {

Modified: core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cascade/CascadeTest.java
===================================================================
--- core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cascade/CascadeTest.java	2009-12-10 00:34:12 UTC (rev 18190)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cascade/CascadeTest.java	2009-12-10 09:32:25 UTC (rev 18191)
@@ -102,6 +102,40 @@
 		s.close();
 	}
 
+	public void testDetach() {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Tooth tooth = new Tooth();
+		Mouth mouth = new Mouth();
+		s.persist( mouth );
+		s.persist( tooth );
+		tooth.mouth = mouth;
+		mouth.teeth = new ArrayList<Tooth>();
+		mouth.teeth.add( tooth );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		mouth = (Mouth) s.get( Mouth.class, mouth.id );
+		assertNotNull( mouth );
+		assertEquals( 1, mouth.teeth.size() );
+		tooth = mouth.teeth.iterator().next();
+		s.evict( mouth );
+		assertFalse( s.contains( tooth ) );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete( s.get( Mouth.class, mouth.id ) );
+		
+		tx.commit();
+		s.close();
+	}
+
 	public CascadeTest(String x) {
 		super( x );
 	}

Modified: core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cascade/Mouth.java
===================================================================
--- core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cascade/Mouth.java	2009-12-10 00:34:12 UTC (rev 18190)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cascade/Mouth.java	2009-12-10 09:32:25 UTC (rev 18191)
@@ -8,6 +8,7 @@
 import javax.persistence.Id;
 import javax.persistence.OneToMany;
 import javax.persistence.Column;
+import static javax.persistence.CascadeType.*;
 
 /**
  * @author Emmanuel Bernard
@@ -19,6 +20,6 @@
 	public Integer id;
 	@Column(name="mouth_size")
 	public int size;
-	@OneToMany(mappedBy = "mouth", cascade = CascadeType.REMOVE)
+	@OneToMany(mappedBy = "mouth", cascade = { REMOVE, DETACH } )
 	public Collection<Tooth> teeth;
 }

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/AbstractEntityManagerImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/AbstractEntityManagerImpl.java	2009-12-10 00:34:12 UTC (rev 18190)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/AbstractEntityManagerImpl.java	2009-12-10 09:32:25 UTC (rev 18191)
@@ -43,6 +43,7 @@
 import javax.persistence.TransactionRequiredException;
 import javax.persistence.TypedQuery;
 import javax.persistence.PessimisticLockScope;
+import javax.persistence.LockTimeoutException;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.metamodel.Metamodel;
@@ -805,6 +806,9 @@
 		if ( e instanceof NonUniqueResultException ) {
 			return;
 		}
+		if ( e instanceof LockTimeoutException ) {
+			return;
+		}
 
 		try {
 			markAsRollback();

Modified: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/cascade/CascadeTest.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/cascade/CascadeTest.java	2009-12-10 00:34:12 UTC (rev 18190)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/cascade/CascadeTest.java	2009-12-10 09:32:25 UTC (rev 18191)
@@ -31,8 +31,7 @@
 
 		em.persist( teacher );
 		em.getTransaction().commit();
-	
-		System.out.println("***************************");
+
 		em = getOrCreateEntityManager();
 		em.getTransaction().begin();
 		

Added: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/cascade/DetachAndContainsTest.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/cascade/DetachAndContainsTest.java	                        (rev 0)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/cascade/DetachAndContainsTest.java	2009-12-10 09:32:25 UTC (rev 18191)
@@ -0,0 +1,78 @@
+package org.hibernate.ejb.test.cascade;
+
+import java.util.Collection;
+import java.util.ArrayList;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.OneToMany;
+import javax.persistence.ManyToOne;
+import javax.persistence.EntityManager;
+import static javax.persistence.CascadeType.*;
+
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DetachAndContainsTest extends TestCase {
+
+	public void testDetach() {
+		EntityManager em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+
+		Tooth tooth = new Tooth();
+		Mouth mouth = new Mouth();
+		em.persist( mouth );
+		em.persist( tooth );
+		tooth.mouth = mouth;
+		mouth.teeth = new ArrayList<Tooth>();
+		mouth.teeth.add( tooth );
+		em.getTransaction().commit();
+		em.close();
+
+		em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+		mouth = em.find( Mouth.class, mouth.id );
+		assertNotNull( mouth );
+		assertEquals( 1, mouth.teeth.size() );
+		tooth = mouth.teeth.iterator().next();
+		em.detach( mouth );
+		assertFalse( em.contains( tooth ) );
+		em.getTransaction().commit();
+		em.close();
+
+		em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+		em.remove( em.find( Mouth.class, mouth.id ) );
+
+		em.getTransaction().commit();
+		em.close();
+	}
+
+	public Class[] getAnnotatedClasses() {
+		return new Class[] {
+				Mouth.class,
+				Tooth.class
+		};
+	}
+
+	@Entity
+	public static class Mouth {
+		@Id
+		@GeneratedValue
+		public Integer id;
+		@OneToMany(mappedBy = "mouth", cascade = { DETACH, REMOVE } )
+		public Collection<Tooth> teeth;
+	}
+
+	@Entity
+	public static class Tooth {
+		@Id
+		@GeneratedValue
+		public Integer id;
+		public String type;
+		@ManyToOne
+		public Mouth mouth;
+	}
+}



More information about the hibernate-commits mailing list