[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