[hibernate-commits] Hibernate SVN: r14502 - core/branches/Branch_3_2/test/org/hibernate/test/cascade.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Apr 11 00:47:54 EDT 2008


Author: gbadner
Date: 2008-04-11 00:47:54 -0400 (Fri, 11 Apr 2008)
New Revision: 14502

Added:
   core/branches/Branch_3_2/test/org/hibernate/test/cascade/A.java
   core/branches/Branch_3_2/test/org/hibernate/test/cascade/G.java
   core/branches/Branch_3_2/test/org/hibernate/test/cascade/H.java
   core/branches/Branch_3_2/test/org/hibernate/test/cascade/MultiPathCascade.hbm.xml
   core/branches/Branch_3_2/test/org/hibernate/test/cascade/MultiPathCascadeTest.java
Modified:
   core/branches/Branch_3_2/test/org/hibernate/test/cascade/CascadeSuite.java
Log:
HHH-3229 : Added test cases for modifying an entity with multiple paths to associated entities


Added: core/branches/Branch_3_2/test/org/hibernate/test/cascade/A.java
===================================================================
--- core/branches/Branch_3_2/test/org/hibernate/test/cascade/A.java	                        (rev 0)
+++ core/branches/Branch_3_2/test/org/hibernate/test/cascade/A.java	2008-04-11 04:47:54 UTC (rev 14502)
@@ -0,0 +1,106 @@
+// $Id$
+
+package org.hibernate.test.cascade;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ *
+ * Copyright 2008 Ovidiu Feodorov
+ *
+ */
+public class A
+{
+    // Constants -----------------------------------------------------------------------------------
+
+    // Static --------------------------------------------------------------------------------------
+
+    // Attributes ----------------------------------------------------------------------------------
+
+    private long id;
+
+    private String data;
+
+    // A 1 - * H
+    private Set hs;
+
+    // A 1 - 1 G
+    private G g;
+
+
+    // Constructors --------------------------------------------------------------------------------
+
+    public A()
+    {
+        hs = new HashSet();
+    }
+
+    public A(String data)
+    {
+        this();
+        this.data = data;
+    }
+
+    // Public --------------------------------------------------------------------------------------
+
+    public long getId()
+    {
+        return id;
+    }
+
+    public void setId(long id)
+    {
+        this.id = id;
+    }
+
+    public void setData(String data)
+    {
+        this.data = data;
+    }
+
+    public String getData()
+    {
+        return data;
+    }
+
+    public void setHs(Set hs)
+    {
+        this.hs = hs;
+    }
+
+    public Set getHs()
+    {
+        return hs;
+    }
+
+    public void setG(G g)
+    {
+        this.g = g;
+    }
+
+    public G getG()
+    {
+        return g;
+    }
+
+    public void addH(H h)
+    {
+        hs.add(h);
+        h.setA(this);
+    }
+
+    public String toString()
+    {
+        return "A[" + id + ", " + data + "]";
+    }
+
+    // Package protected ---------------------------------------------------------------------------
+
+    // Protected -----------------------------------------------------------------------------------
+
+    // Private -------------------------------------------------------------------------------------
+
+    // Inner classes -------------------------------------------------------------------------------
+}


Property changes on: core/branches/Branch_3_2/test/org/hibernate/test/cascade/A.java
___________________________________________________________________
Name: svn:executable
   + *

Modified: core/branches/Branch_3_2/test/org/hibernate/test/cascade/CascadeSuite.java
===================================================================
--- core/branches/Branch_3_2/test/org/hibernate/test/cascade/CascadeSuite.java	2008-04-10 19:32:31 UTC (rev 14501)
+++ core/branches/Branch_3_2/test/org/hibernate/test/cascade/CascadeSuite.java	2008-04-11 04:47:54 UTC (rev 14502)
@@ -12,6 +12,7 @@
 		TestSuite suite = new TestSuite( "Cascade tests" );
 		suite.addTest( BidirectionalOneToManyCascadeTest.suite() );
 		suite.addTest( RefreshTest.suite() );
+		suite.addTest( MultiPathCascadeTest.suite() );
 		return suite;
 	}
 }

Added: core/branches/Branch_3_2/test/org/hibernate/test/cascade/G.java
===================================================================
--- core/branches/Branch_3_2/test/org/hibernate/test/cascade/G.java	                        (rev 0)
+++ core/branches/Branch_3_2/test/org/hibernate/test/cascade/G.java	2008-04-11 04:47:54 UTC (rev 14502)
@@ -0,0 +1,95 @@
+package org.hibernate.test.cascade;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ *
+ * Copyright 2008 Ovidiu Feodorov
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ * $Id$
+ */
+public class G
+{
+    // Constants -----------------------------------------------------------------------------------
+
+    // Static --------------------------------------------------------------------------------------
+
+    // Attributes ----------------------------------------------------------------------------------
+
+    private long id;
+
+    private String data;
+
+    // A 1 <-> 1 G
+    private A a;
+
+    // G * <-> * H
+    private Set hs;
+
+    // Constructors --------------------------------------------------------------------------------
+
+    public G()
+    {
+        this(null);
+    }
+
+    public G(String data)
+    {
+        this.data = data;
+        hs = new HashSet();
+    }
+
+    // Public --------------------------------------------------------------------------------------
+
+    public String getData()
+    {
+        return data;
+    }
+
+    public void setData(String data)
+    {
+        this.data = data;
+    }
+
+    public A getA()
+    {
+        return a;
+    }
+
+    public void setA(A a)
+    {
+        this.a = a;
+    }
+
+    public Set getHs()
+    {
+        return hs;
+    }
+
+    public void setHs(Set s)
+    {
+        hs = s;
+    }
+
+    // Package protected ---------------------------------------------------------------------------
+
+    long getId()
+    {
+        return id;
+    }
+
+    // Protected -----------------------------------------------------------------------------------
+
+    // Private -------------------------------------------------------------------------------------
+
+    private void setId(long id)
+    {
+        this.id = id;
+    }
+
+    // Inner classes -------------------------------------------------------------------------------
+}


Property changes on: core/branches/Branch_3_2/test/org/hibernate/test/cascade/G.java
___________________________________________________________________
Name: svn:executable
   + *

Added: core/branches/Branch_3_2/test/org/hibernate/test/cascade/H.java
===================================================================
--- core/branches/Branch_3_2/test/org/hibernate/test/cascade/H.java	                        (rev 0)
+++ core/branches/Branch_3_2/test/org/hibernate/test/cascade/H.java	2008-04-11 04:47:54 UTC (rev 14502)
@@ -0,0 +1,94 @@
+// $Id$
+
+
+package org.hibernate.test.cascade;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ *
+ * Copyright 2008 Ovidiu Feodorov
+ *
+ */
+public class H
+{
+    // Constants -----------------------------------------------------------------------------------
+
+    // Static --------------------------------------------------------------------------------------
+
+    // Attributes ----------------------------------------------------------------------------------
+
+    private long id;
+
+    private String data;
+
+    private A a;
+
+    // G * <-> * H
+    private Set gs;
+
+    // Constructors --------------------------------------------------------------------------------
+
+    public H()
+    {
+        this(null);
+    }
+
+    public H(String data)
+    {
+        this.data = data;
+        gs = new HashSet();
+    }
+
+    // Public --------------------------------------------------------------------------------------
+
+    public long getId()
+    {
+        return id;
+    }
+
+    public String getData()
+    {
+        return data;
+    }
+
+    public void setData(String data)
+    {
+        this.data = data;
+    }
+
+    public A getA()
+    {
+        return a;
+    }
+
+    public void setA(A a)
+    {
+        this.a = a;
+    }
+
+    public Set getGs()
+    {
+        return gs;
+    }
+
+    public void setGs(Set gs)
+    {
+        this.gs = gs;
+    }
+
+    // Package protected ---------------------------------------------------------------------------
+
+    // Protected -----------------------------------------------------------------------------------
+
+    // Private -------------------------------------------------------------------------------------
+
+    private void setId(long id)
+    {
+        this.id = id;
+    }
+
+    // Inner classes -------------------------------------------------------------------------------
+}


Property changes on: core/branches/Branch_3_2/test/org/hibernate/test/cascade/H.java
___________________________________________________________________
Name: svn:executable
   + *

Added: core/branches/Branch_3_2/test/org/hibernate/test/cascade/MultiPathCascade.hbm.xml
===================================================================
--- core/branches/Branch_3_2/test/org/hibernate/test/cascade/MultiPathCascade.hbm.xml	                        (rev 0)
+++ core/branches/Branch_3_2/test/org/hibernate/test/cascade/MultiPathCascade.hbm.xml	2008-04-11 04:47:54 UTC (rev 14502)
@@ -0,0 +1,67 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.cascade">
+
+    <class name="A" table="HB_A">
+
+        <id name="id" type="long"><generator class="native"/></id>
+
+        <property name="data" type="string" not-null="true"/>
+
+        <!--
+             Associations
+        -->
+
+        <set name="hs" inverse="true" cascade="all">
+            <key column="a_fk"/>
+            <one-to-many class="H"/>
+        </set>
+        <one-to-one name="g" class="G" property-ref="a" cascade="all"/>
+
+    </class>
+
+    <class name="G" table="HB_G">
+
+        <id name="id" type="long"><generator class="native"/></id>
+
+        <property name="data" type="string" not-null="true"/>
+
+        <!--
+             Associations
+        -->
+
+        <set name="hs" inverse="true" table="HB_G_H" cascade="all">
+            <key column="g_fk"/>
+            <many-to-many class="H" column="h_fk"/>
+        </set>
+
+        <many-to-one name="a"
+            column="aId"
+            unique="true"
+            not-null="false"/>
+
+    </class>
+
+    <class name="H" table="HB_H">
+
+        <id name="id" type="long"><generator class="native"/></id>
+
+        <property name="data" type="string" not-null="true"/>
+
+        <!--
+            Associations
+        -->
+
+        <!-- *NOT* cascaded -->
+        <set name="gs" table="HB_G_H">
+            <key column="h_fk"/>
+            <many-to-many class="G" column="g_fk"/>
+        </set>
+
+        <many-to-one name="a" column="a_fk" class="A"/>
+
+    </class>
+
+
+</hibernate-mapping>
\ No newline at end of file

Added: core/branches/Branch_3_2/test/org/hibernate/test/cascade/MultiPathCascadeTest.java
===================================================================
--- core/branches/Branch_3_2/test/org/hibernate/test/cascade/MultiPathCascadeTest.java	                        (rev 0)
+++ core/branches/Branch_3_2/test/org/hibernate/test/cascade/MultiPathCascadeTest.java	2008-04-11 04:47:54 UTC (rev 14502)
@@ -0,0 +1,160 @@
+//$Id: $
+
+package org.hibernate.test.cascade;
+
+import java.util.Collections;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.junit.functional.FunctionalTestCase;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ * @author Gail Badner
+ *
+ */
+
+public class MultiPathCascadeTest extends FunctionalTestCase {
+
+	public MultiPathCascadeTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+				"cascade/MultiPathCascade.hbm.xml"
+		};
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MultiPathCascadeTest.class );
+	}
+
+	public void testMultiPathMergeDetachedFailureExpected() throws Exception
+	{
+		// persist a simple A in the database
+
+		Session s = openSession();
+		s.beginTransaction();
+		A a = new A();
+		a.setData("Anna");
+		s.save(a);
+		s.getTransaction().commit();
+		s.close();
+
+		// modify detached entity
+		modifyEntity( a );
+
+		s = openSession();
+		s.beginTransaction();
+		s.merge(a);
+		s.getTransaction().commit();
+		s.close();
+
+		verifyModifications( a.getId() );
+	}
+
+	public void testMultiPathUpdateDetached() throws Exception
+	{
+		// persist a simple A in the database
+
+		Session s = openSession();
+		s.beginTransaction();
+		A a = new A();
+		a.setData("Anna");
+		s.save(a);
+		s.getTransaction().commit();
+		s.close();
+
+		// modify detached entity
+		modifyEntity( a );
+
+		s = openSession();
+		s.beginTransaction();
+		s.update(a);
+		s.getTransaction().commit();
+		s.close();
+
+		verifyModifications( a.getId() );
+	}
+
+	public void testMultiPathGetAndModify() throws Exception
+	{
+		// persist a simple A in the database
+
+		Session s = openSession();
+		s.beginTransaction();
+		A a = new A();
+		a.setData("Anna");
+		s.save(a);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		// retrieve the previously saved instance from the database, and update it
+		a = ( A ) s.get( A.class, new Long( a.getId() ) );
+		modifyEntity( a );
+		s.getTransaction().commit();
+		s.close();
+
+		verifyModifications( a.getId() );
+	}
+
+	private void modifyEntity(A a) {
+		// create a *circular* graph in detached entity
+		a.setData("Anthony");
+
+		G g = new G();
+		g.setData("Giovanni");
+
+		H h = new H();
+		h.setData("Hellen");
+
+		a.setG(g);
+		g.setA(a);
+
+		a.getHs().add(h);
+		h.setA(a);
+
+		g.getHs().add(h);
+		h.getGs().add(g);
+	}
+
+	private void verifyModifications(long aId) {
+		Session s = openSession();
+		s.beginTransaction();
+
+		// retrieve the A object and check it
+		A a = ( A ) s.get( A.class, new Long( aId ) );
+		assertEquals( aId, a.getId() );
+		assertEquals( "Anthony", a.getData() );
+		assertNotNull( a.getG() );
+		assertNotNull( a.getHs() );
+		assertEquals( 1, a.getHs().size() );
+
+		G gFromA = a.getG();
+		H hFromA = ( H ) a.getHs().iterator().next();
+
+		// check the G object
+		assertEquals( "Giovanni", gFromA.getData() );
+		assertSame( a, gFromA.getA() );
+		assertNotNull( gFromA.getHs() );
+		assertEquals( a.getHs(), gFromA.getHs() );
+		assertSame( hFromA, gFromA.getHs().iterator().next() );
+
+		// check the H object
+		assertEquals( "Hellen", hFromA.getData() );
+		assertSame( a, hFromA.getA() );
+		assertNotNull( hFromA.getGs() );
+		assertEquals( 1, hFromA.getGs().size() );
+		assertSame( gFromA, hFromA.getGs().iterator().next() );
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
+}
\ No newline at end of file




More information about the hibernate-commits mailing list