[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