Package org.hibernate.test.legacy

Source Code of org.hibernate.test.legacy.ParentChildTest

//$Id: ParentChildTest.java 11089 2007-01-24 14:34:22Z max.andersen@jboss.com $
package org.hibernate.test.legacy;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import junit.framework.Test;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.ObjectNotFoundException;
import org.hibernate.ReplicationMode;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Restrictions;
import org.hibernate.dialect.DB2Dialect;
import org.hibernate.dialect.HSQLDialect;
import org.hibernate.dialect.IngresDialect;
import org.hibernate.dialect.MySQLDialect;
import org.hibernate.engine.EntityEntry;
import org.hibernate.impl.SessionImpl;
import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
import org.hibernate.proxy.HibernateProxy;


public class ParentChildTest extends LegacyTestCase {

  public ParentChildTest(String x) {
    super(x);
  }

  public String[] getMappings() {
    return new String[] {
      "legacy/ParentChild.hbm.xml",
      "legacy/FooBar.hbm.xml",
       "legacy/Baz.hbm.xml",
       "legacy/Qux.hbm.xml",
       "legacy/Glarch.hbm.xml",
       "legacy/Fum.hbm.xml",
       "legacy/Fumm.hbm.xml",
       "legacy/Fo.hbm.xml",
       "legacy/One.hbm.xml",
       "legacy/Many.hbm.xml",
       "legacy/Immutable.hbm.xml",
       "legacy/Fee.hbm.xml",
       "legacy/Vetoer.hbm.xml",
       "legacy/Holder.hbm.xml",
       "legacy/Simple.hbm.xml",
       "legacy/Container.hbm.xml",
       "legacy/Circular.hbm.xml",
       "legacy/Stuff.hbm.xml"
    };
  }

  public static Test suite() {
    return new FunctionalTestClassTestSuite( ParentChildTest.class );
  }

  public void testReplicate() throws Exception {
    Session s = openSession();
    s.beginTransaction();
    Container baz = new Container();
    Contained f = new Contained();
    List list = new ArrayList();
    list.add(baz);
    f.setBag(list);
    List list2 = new ArrayList();
    list2.add(f);
    baz.setBag(list2);
    s.save(f);
    s.save(baz);
    s.getTransaction().commit();
    s.close();

    s = openSession();
    s.beginTransaction();
    s.replicate(baz, ReplicationMode.OVERWRITE);
    // HHH-2378
    SessionImpl x = (SessionImpl)s;
    EntityEntry entry = x.getPersistenceContext().getEntry( baz );
    assertNull(entry.getVersion());
    // ~~~~~~~
    s.getTransaction().commit();
    s.close();

    s = openSession();
    s.beginTransaction();
    s.replicate(baz, ReplicationMode.IGNORE);
    s.getTransaction().commit();
    s.close();

    s = openSession();
    s.beginTransaction();
    s.delete(baz);
    s.delete(f);
    s.getTransaction().commit();
    s.close();
  }

  public void testQueryOneToOne() throws Exception {
    Session s = openSession();
    Transaction t = s.beginTransaction();
    Serializable id = s.save( new Parent() );
    assertTrue( s.createQuery( "from Parent p left join fetch p.child" ).list().size()==1 );
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    Parent p = (Parent) s.createQuery("from Parent p left join fetch p.child").uniqueResult();
    assertTrue( p.getChild()==null );
    s.createQuery( "from Parent p join p.child c where c.x > 0" ).list();
    s.createQuery( "from Child c join c.parent p where p.x > 0" ).list();
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    s.delete( s.get(Parent.class, id) );
    t.commit();
    s.close();
  }

  public void testProxyReuseFailureExpected() throws Exception {
    Session s = openSession();
    Transaction t = s.beginTransaction();
    FooProxy foo = new Foo();
    FooProxy foo2 = new Foo();
    Serializable id = s.save(foo);
    Serializable id2 = s.save(foo2);
    foo2.setInt(1234567);
    foo.setInt(1234);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    foo = (FooProxy) s.load(Foo.class, id);
    foo2 = (FooProxy) s.load(Foo.class, id2);
    assertFalse( Hibernate.isInitialized(foo) );
    Hibernate.initialize(foo2);
    Hibernate.initialize(foo);
    assertTrue( foo.getComponent().getImportantDates().length==4 );
    assertTrue( foo2.getComponent().getImportantDates().length==4 );
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    foo.setFloat( new Float(1.2f) );
    foo2.setFloat( new Float(1.3f) );
    foo2.getDependent().setKey(null);
    foo2.getComponent().getSubcomponent().getFee().setKey(null);
    assertFalse( foo2.getKey().equals(id) );
    s.save(foo, "xyzid");
    s.update(foo2, id); //intentionally id, not id2!
    assertEquals( foo2.getKey(), id );
    assertTrue( foo2.getInt()==1234567 );
    assertEquals( foo.getKey(), "xyzid" );
    t.commit();
    s.close();
   
    s = openSession();
    t = s.beginTransaction();
    foo = (FooProxy) s.load(Foo.class, id);
    assertTrue( foo.getInt()==1234567 );
    assertTrue( foo.getComponent().getImportantDates().length==4 );
    String feekey = foo.getDependent().getKey();
    String fookey = foo.getKey();
    s.delete(foo);
    s.delete( s.get(Foo.class, id2) );
    s.delete( s.get(Foo.class, "xyzid") );
// here is the issue (HHH-4092).  After the deletes above there are 2 Fees and a Glarch unexpectedly hanging around
    assertEquals( 2, doDelete( s, "from java.lang.Object" ) );
    t.commit();
    s.close();
   
    //to account for new id rollback shit
    foo.setKey(fookey);
    foo.getDependent().setKey(feekey);
    foo.getComponent().setGlarch(null);
    foo.getComponent().setSubcomponent(null);
   
    s = openSession();
    t = s.beginTransaction();
    //foo.getComponent().setGlarch(null); //no id property!
    s.replicate(foo, ReplicationMode.OVERWRITE);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    Foo refoo = (Foo) s.get(Foo.class, id);
    assertEquals( feekey, refoo.getDependent().getKey() );
    s.delete(refoo);
    t.commit();
    s.close();
  }

  public void testComplexCriteria() throws Exception {
    Session s = openSession();
    Transaction t = s.beginTransaction();
    Baz baz = new Baz();
    s.save(baz);
    baz.setDefaults();
    Map topGlarchez = new HashMap();
    baz.setTopGlarchez(topGlarchez);
    Glarch g1 = new Glarch();
    g1.setName("g1");
    s.save(g1);
    Glarch g2 = new Glarch();
    g2.setName("g2");
    s.save(g2);
    g1.setProxyArray( new GlarchProxy[] {g2} );
    topGlarchez.put( new Character('1'),g1 );
    topGlarchez.put( new Character('2'), g2);
    Foo foo1 = new Foo();
    Foo foo2 = new Foo();
    s.save(foo1);
    s.save(foo2);
    baz.getFooSet().add(foo1);
    baz.getFooSet().add(foo2);
    baz.setFooArray( new FooProxy[] { foo1 } );

    LockMode lockMode = (getDialect() instanceof DB2Dialect) ? LockMode.READ : LockMode.UPGRADE;

    Criteria crit = s.createCriteria(Baz.class);
    crit.createCriteria("topGlarchez")
      .add( Restrictions.isNotNull("name") )
      .createCriteria("proxyArray")
        .add( Restrictions.eqProperty("name", "name") )
        .add( Restrictions.eq("name", "g2") )
        .add( Restrictions.gt("x", new Integer(-666) ) );
    crit.createCriteria("fooSet")
      .add( Restrictions.isNull("null") )
      .add( Restrictions.eq("string", "a string") )
      .add( Restrictions.lt("integer", new Integer(-665) ) );
    crit.createCriteria("fooArray")
        // this is the bit causing the problems; creating the criteria on fooArray does not add it to FROM,
        // and so restriction below leads to an invalid reference.
      .add( Restrictions.eq("string", "a string") )
      .setLockMode(lockMode);

    List list = crit.list();
    assertTrue( list.size()==2 );
   
    s.createCriteria(Glarch.class).setLockMode(LockMode.UPGRADE).list();
    s.createCriteria(Glarch.class).setLockMode(Criteria.ROOT_ALIAS, LockMode.UPGRADE).list();
   
    g2.setName(null);
    t.commit();
    s.close();
   
    s = openSession();
    t = s.beginTransaction();
   
    list = s.createCriteria(Baz.class).add( Restrictions.isEmpty("fooSet") ).list();
    assertEquals( list.size(), 0 );

    list = s.createCriteria(Baz.class).add( Restrictions.isNotEmpty("fooSet") ).list();
    assertEquals( new HashSet(list).size(), 1 );

    list = s.createCriteria(Baz.class).add( Restrictions.sizeEq("fooSet", 2) ).list();
    assertEquals( new HashSet(list).size(), 1 );
   
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();

    crit = s.createCriteria(Baz.class)
      .setLockMode(lockMode);
    crit.createCriteria("topGlarchez")
      .add( Restrictions.gt( "x", new Integer(-666) ) );
    crit.createCriteria("fooSet")
      .add( Restrictions.isNull("null") );
    list = crit.list();

    assertTrue( list.size()==4 );
    baz = (Baz) crit.uniqueResult();
    assertTrue( Hibernate.isInitialized(baz.getTopGlarchez()) ); //cos it is nonlazy
    assertTrue( !Hibernate.isInitialized(baz.getFooSet()) );

    list = s.createCriteria(Baz.class)
      .createCriteria("fooSet")
        .createCriteria("foo")
          .createCriteria("component.glarch")
            .add( Restrictions.eq("name", "xxx") )
      .list();
    assertTrue( list.size()==0 );

    list = s.createCriteria(Baz.class)
      .createAlias("fooSet", "foo")
      .createAlias("foo.foo", "foo2")
      .setLockMode("foo2", lockMode)
      .add( Restrictions.isNull("foo2.component.glarch") )
      .createCriteria("foo2.component.glarch")
        .add( Restrictions.eq("name", "xxx") )
      .list();
    assertTrue( list.size()==0 );

    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();

    crit = s.createCriteria(Baz.class);
    crit.createCriteria("topGlarchez")
      .add( Restrictions.isNotNull("name") );
    crit.createCriteria("fooSet")
      .add( Restrictions.isNull("null") );

    list = crit.list();
    assertTrue( list.size()==2 );
    baz = (Baz) crit.uniqueResult();
    assertTrue( Hibernate.isInitialized(baz.getTopGlarchez()) ); //cos it is nonlazy
    assertTrue( !Hibernate.isInitialized(baz.getFooSet()) );
   
    s.createCriteria(Child.class).setFetchMode("parent", FetchMode.JOIN).list();

    doDelete( s, "from Glarch g" );
    s.delete( s.get(Foo.class, foo1.getKey() ) );
    s.delete( s.get(Foo.class, foo2.getKey() ) );
    s.delete(baz);
    t.commit();
    s.close();
  }

  public void testArrayHQL() {
    Session s = openSession();
    Transaction t = s.beginTransaction();
    Baz baz = new Baz();
    s.save(baz);
    Foo foo1 = new Foo();
    s.save(foo1);
    baz.setFooArray( new FooProxy[] { foo1 } );

    s.flush();
    s.clear();

    baz = ( Baz ) s.createQuery("from Baz b left join fetch b.fooArray").uniqueResult();
    assertEquals( 1, baz.getFooArray().length );

    t.rollback();
    s.close();

  }

  public void testArrayCriteria() {

    Session s = openSession();
    Transaction t = s.beginTransaction();
    Baz baz = new Baz();
    s.save(baz);
    Foo foo1 = new Foo();
    s.save(foo1);
    baz.setFooArray( new FooProxy[] { foo1 } );

    s.flush();
    s.clear();

    baz = ( Baz ) s.createCriteria(Baz.class).createCriteria( "fooArray" ).uniqueResult();
    assertEquals( 1, baz.getFooArray().length );

    t.rollback();
    s.close();
  }

  public void testLazyManyToOneHQL() {
    Session s = openSession();
    Transaction t = s.beginTransaction();
    Baz baz = new Baz();
    s.save(baz);
    Foo foo1 = new Foo();
    s.save(foo1);
    baz.setFoo( foo1 );

    s.flush();
    s.clear();

    baz = ( Baz ) s.createQuery("from Baz b").uniqueResult();
    assertFalse( Hibernate.isInitialized( baz.getFoo() ) );
    assertTrue( baz.getFoo() instanceof HibernateProxy );

    t.rollback();
    s.close();

  }

  public void testLazyManyToOneCriteria() {

    Session s = openSession();
    Transaction t = s.beginTransaction();
    Baz baz = new Baz();
    s.save(baz);
    Foo foo1 = new Foo();
    s.save(foo1);
    baz.setFoo( foo1 );

    s.flush();
    s.clear();

    baz = ( Baz ) s.createCriteria( Baz.class ).uniqueResult();
    assertTrue( Hibernate.isInitialized( baz.getFoo() ) );
    assertFalse( baz.getFoo() instanceof HibernateProxy );

    t.rollback();
    s.close();
  }

  public void testLazyManyToOneGet() {

    Session s = openSession();
    Transaction t = s.beginTransaction();
    Baz baz = new Baz();
    s.save(baz);
    Foo foo1 = new Foo();
    s.save(foo1);
    baz.setFoo( foo1 );

    s.flush();
    s.clear();

    baz = ( Baz ) s.get( Baz.class, baz.getCode() );
    assertTrue( Hibernate.isInitialized( baz.getFoo() ) );
    assertFalse( baz.getFoo() instanceof HibernateProxy );

    t.rollback();
    s.close();
  }

  public void testClassWhere() throws Exception {
    Session s = openSession();
    Transaction t = s.beginTransaction();
    Baz baz = new Baz();
    baz.setParts( new ArrayList() );
    Part p1 = new Part();
    p1.setDescription("xyz");
    Part p2 = new Part();
    p2.setDescription("abc");
    baz.getParts().add(p1);
    baz.getParts().add(p2);
    s.save(baz);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    assertTrue( s.createCriteria(Part.class).list().size()==1 ); //there is a where condition on Part mapping
    assertTrue( s.createCriteria(Part.class).add( Restrictions.eq( "id", p1.getId() ) ).list().size()==1 );
    assertTrue( s.createQuery("from Part").list().size()==1 );
    assertTrue( s.createQuery("from Baz baz join baz.parts").list().size()==2 );
    baz = (Baz) s.createCriteria(Baz.class).uniqueResult();
    assertTrue( s.createFilter( baz.getParts(), "" ).list().size()==2 );
    //assertTrue( baz.getParts().size()==1 );
    s.delete( s.get( Part.class, p1.getId() ));
    s.delete( s.get( Part.class, p2.getId() ));
    s.delete(baz);
    t.commit();
    s.close();
  }

  public void testClassWhereManyToMany() throws Exception {
    Session s = openSession();
    Transaction t = s.beginTransaction();
    Baz baz = new Baz();
    baz.setMoreParts( new ArrayList() );
    Part p1 = new Part();
    p1.setDescription("xyz");
    Part p2 = new Part();
    p2.setDescription("abc");
    baz.getMoreParts().add(p1);
    baz.getMoreParts().add(p2);
    s.save(baz);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    assertTrue( s.createCriteria(Part.class).list().size()==1 ); //there is a where condition on Part mapping
    assertTrue( s.createCriteria(Part.class).add( Restrictions.eq( "id", p1.getId() ) ).list().size()==1 );
    assertTrue( s.createQuery("from Part").list().size()==1 );
    assertTrue( s.createQuery("from Baz baz join baz.moreParts").list().size()==2 );
    baz = (Baz) s.createCriteria(Baz.class).uniqueResult();
    assertTrue( s.createFilter( baz.getMoreParts(), "" ).list().size()==2 );
    //assertTrue( baz.getParts().size()==1 );
    s.delete( s.get( Part.class, p1.getId() ));
    s.delete( s.get( Part.class, p2.getId() ));
    s.delete(baz);
    t.commit();
    s.close();
  }

  public void testCollectionQuery() throws Exception {
    Session s = openSession();
    Transaction t = s.beginTransaction();

    Simple s1 = new Simple();
    s1.setName("s");
    s1.setCount(0);
    Simple s2 = new Simple();
    s2.setCount(2);
    Simple s3 = new Simple();
    s3.setCount(3);
    s.save( s1, new Long(1) ); s.save( s2, new Long(2) ); s.save( s3, new Long(3) );
    Container c = new Container();
    Contained cd = new Contained();
    List bag = new ArrayList();
    bag.add(cd);
    c.setBag(bag);
    List l = new ArrayList();
    l.add(s1);
    l.add(s3);
    l.add(s2);
    c.setOneToMany(l);
    l = new ArrayList();
    l.add(s1);
    l.add(null);
    l.add(s2);
    c.setManyToMany(l);
    s.save(c);
    Container cx = new Container();
    s.save(cx);
    Simple sx = new Simple();
    sx.setCount(5);
    sx.setName("s");
    s.save( sx, new Long(5) );
    assertTrue(
        s.createQuery( "select c from ContainerX c, Simple s where c.oneToMany[2] = s" ).list()
            .size() == 1
    );
    assertTrue(
        s.createQuery( "select c from ContainerX c, Simple s where c.manyToMany[2] = s" ).list()
            .size() == 1
    );
    assertTrue(
        s.createQuery( "select c from ContainerX c, Simple s where s = c.oneToMany[2]" ).list()
            .size() == 1
    );
    assertTrue(
        s.createQuery( "select c from ContainerX c, Simple s where s = c.manyToMany[2]" ).list()
            .size() == 1
    );
    assertTrue(
        s.createQuery( "select c from ContainerX c where c.oneToMany[0].name = 's'" ).list()
            .size() == 1
    );
    assertTrue(
        s.createQuery( "select c from ContainerX c where c.manyToMany[0].name = 's'" ).list()
            .size() == 1
    );
    assertTrue(
        s.createQuery( "select c from ContainerX c where 's' = c.oneToMany[2 - 2].name" ).list()
            .size() == 1
    );
    assertTrue(
        s.createQuery( "select c from ContainerX c where 's' = c.manyToMany[(3+1)/4-1].name" ).list()
            .size() == 1
    );
    assertTrue(
        s.createQuery( "select c from ContainerX c where c.oneToMany[ c.manyToMany[0].count ].name = 's'" )
            .list()
            .size() == 1
    );
    assertTrue(
        s.createQuery( "select c from ContainerX c where c.manyToMany[ c.oneToMany[0].count ].name = 's'" )
            .list()
            .size() == 1
    );
    if ( ! ( getDialect() instanceof MySQLDialect ) && !(getDialect() instanceof org.hibernate.dialect.TimesTenDialect) ) {
      assertTrue(
          s.createQuery( "select c from ContainerX c where c.manyToMany[ maxindex(c.manyToMany) ].count = 2" )
              .list()
              .size() == 1
      );
    }
    assertTrue( s.contains(cd) );
    if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof HSQLDialect) )  {
      s.createFilter( c.getBag(), "where 0 in elements(this.bag)" ).list();
      s.createFilter( c.getBag(), "where 0 in elements(this.lazyBag)" ).list();
    }
    s.createQuery( "select count(comp.name) from ContainerX c join c.components comp" ).list();
    s.delete(cd);
    s.delete(c);
    s.delete(s1);
    s.delete(s2);
    s.delete(s3);
    s.delete(cx);
    s.delete(sx);
    t.commit();
    s.close();
  }

  public void testParentChild() throws Exception {
    Session s = openSession();
    Transaction t = s.beginTransaction();
    Parent p = new Parent();
    Child c = new Child();
    c.setParent(p);
    p.setChild(c);
    s.save(p);
    s.save(c);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    c = (Child) s.load( Child.class, new Long( c.getId() ) );
    p = c.getParent();
    assertTrue( "1-1 parent", p!=null );
    c.setCount(32);
    p.setCount(66);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    c = (Child) s.load( Child.class, new Long( c.getId() ) );
    p = c.getParent();
    assertTrue( "1-1 update", p.getCount()==66 );
    assertTrue( "1-1 update", c.getCount()==32 );
    assertTrue(
      "1-1 query",
        s.createQuery( "from Child c where c.parent.count=66" ).list().size()==1
    );
    assertTrue(
      "1-1 query",
      ( (Object[]) s.createQuery( "from Parent p join p.child c where p.count=66" ).list().get(0) ).length==2
    );
    s.createQuery( "select c, c.parent from Child c order by c.parent.count" ).list();
    s.createQuery( "select c, c.parent from Child c where c.parent.count=66 order by c.parent.count" ).list();
    s.createQuery( "select c, c.parent, c.parent.count from Child c order by c.parent.count" ).iterate();
    List result = s.createQuery( "FROM Parent AS p WHERE p.count = ?" )
        .setParameter( 0, new Integer(66), Hibernate.INTEGER )
        .list();
    assertEquals( "1-1 query", 1, result.size() );
    s.delete(c); s.delete(p);
    t.commit();
    s.close();
  }

  public void testParentNullChild() throws Exception {
    Session s = openSession();
    Transaction t = s.beginTransaction();
    Parent p = new Parent();
    s.save(p);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    p = (Parent) s.load( Parent.class, new Long( p.getId() ) );
    assertTrue( p.getChild()==null );
    p.setCount(66);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    p = (Parent) s.load( Parent.class, new Long( p.getId() ) );
    assertTrue( "null 1-1 update", p.getCount()==66 );
    assertTrue( p.getChild()==null );
    s.delete(p);
    t.commit();
    s.close();
  }

  public void testManyToMany() throws Exception {
    Session s = openSession();
    Transaction t = s.beginTransaction();
    Container c = new Container();
    c.setManyToMany( new ArrayList() );
    c.setBag( new ArrayList() );
    Simple s1 = new Simple();
    Simple s2 = new Simple();
    s1.setCount(123); s2.setCount(654);
    Contained c1 = new Contained();
    c1.setBag( new ArrayList() );
    c1.getBag().add(c);
    c.getBag().add(c1);
    c.getManyToMany().add(s1);
    c.getManyToMany().add(s2);
    Serializable cid = s.save(c); //s.save(c1);
    s.save(s1, new Long(12) ); s.save(s2, new Long(-1) );
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    c = (Container) s.load(Container.class, cid);
    assertTrue( c.getBag().size()==1 );
    assertTrue( c.getManyToMany().size()==2 );
    c1 = (Contained) c.getBag().iterator().next();
    assertTrue( c.getBag().size()==1 );
    c.getBag().remove(c1);
    c1.getBag().remove(c);
    assertTrue( c.getManyToMany().remove(0)!=null );
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    c = (Container) s.load(Container.class, cid);
    assertTrue( c.getBag().size()==0 );
    assertTrue( c.getManyToMany().size()==1 );
    c1 = (Contained) s.load( Contained.class, new Long(c1.getId()) );
    assertTrue( c1.getBag().size()==0 );
    assertEquals( 1, doDelete( s, "from ContainerX c" ) );
    assertEquals( 1, doDelete( s, "from Contained" ) );
    assertEquals( 2, doDelete( s, "from Simple" ) );
    t.commit();
    s.close();
  }

  public void testContainer() throws Exception {
    Session s = openSession();
    Transaction t = s.beginTransaction();
    Container c = new Container();
    Simple x = new Simple(); x.setCount(123);
    Simple y = new Simple(); y.setCount(456);
    s.save( x, new Long(1) ); s.save( y, new Long(0) );
    List o2m = new ArrayList();
    o2m.add(x); o2m.add(null); o2m.add(y);
    List m2m = new ArrayList();
    m2m.add(x); m2m.add(null); m2m.add(y);
    c.setOneToMany(o2m); c.setManyToMany(m2m);
    List comps = new ArrayList();
    Container.ContainerInnerClass ccic = new Container.ContainerInnerClass();
    ccic.setName("foo");
    ccic.setSimple(x);
    comps.add(ccic);
    comps.add(null);
    ccic = new Container.ContainerInnerClass();
    ccic.setName("bar");
    ccic.setSimple(y);
    comps.add(ccic);
    HashSet compos = new HashSet();
    compos.add(ccic);
    c.setComposites(compos);
    c.setComponents(comps);
    One one = new One();
    Many many = new Many();
    HashSet manies = new HashSet();
    manies.add(many);
    one.setManies(manies);
    many.setOne(one);
    ccic.setMany(many);
    ccic.setOne(one);
    s.save(one);
    s.save(many);
    s.save(c);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    Long count = (Long) s.createQuery("select count(*) from ContainerX as c join c.components as ce join ce.simple as s where ce.name='foo'").uniqueResult();
    assertTrue( count.intValue()==1 );
    List res = s.createQuery(
        "select c, s from ContainerX as c join c.components as ce join ce.simple as s where ce.name='foo'"
    ).list();
    assertTrue(res.size()==1);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    c = (Container) s.load( Container.class, new Long( c.getId() ) );
    System.out.println( c.getOneToMany() );
    System.out.println( c.getManyToMany() );
    System.out.println( c.getComponents() );
    System.out.println( c.getComposites() );
    ccic = (Container.ContainerInnerClass) c.getComponents().get(2);
    assertTrue( ccic.getMany().getOne()==ccic.getOne() );
    assertTrue( c.getComponents().size()==3 );
    assertTrue( c.getComposites().size()==1 );
    assertTrue( c.getOneToMany().size()==3 );
    assertTrue( c.getManyToMany().size()==3 );
    assertTrue( c.getOneToMany().get(0)!=null );
    assertTrue( c.getOneToMany().get(2)!=null );
    for ( int i=0; i<3; i++ ) {
      assertTrue( c.getManyToMany().get(i) == c.getOneToMany().get(i) );
    }
    Object o1 = c.getOneToMany().get(0);
    Object o2 = c.getOneToMany().remove(2);
    c.getOneToMany().set(0, o2);
    c.getOneToMany().set(1, o1);
    o1 = c.getComponents().remove(2);
    c.getComponents().set(0, o1);
    c.getManyToMany().set( 0, c.getManyToMany().get(2) );
    Container.ContainerInnerClass ccic2 = new Container.ContainerInnerClass();
    ccic2.setName("foo");
    ccic2.setOne(one);
    ccic2.setMany(many);
    ccic2.setSimple( (Simple) s.load(Simple.class, new Long(0) ) );
    c.getComposites().add(ccic2);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    c = (Container) s.load( Container.class, new Long( c.getId() ) );
    System.out.println( c.getOneToMany() );
    System.out.println( c.getManyToMany() );
    System.out.println( c.getComponents() );
    System.out.println( c.getComposites() );
    assertTrue( c.getComponents().size()==1 ); //WAS: 2
    assertTrue( c.getComposites().size()==2 );
    assertTrue( c.getOneToMany().size()==2 );
    assertTrue( c.getManyToMany().size()==3 );
    assertTrue( c.getOneToMany().get(0)!=null );
    assertTrue( c.getOneToMany().get(1)!=null );
    ( (Container.ContainerInnerClass) c.getComponents().get(0) ).setName("a different name");
    ( (Container.ContainerInnerClass) c.getComposites().iterator().next() ).setName("once again");
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    c = (Container) s.load( Container.class, new Long( c.getId() ) );
    System.out.println( c.getOneToMany() );
    System.out.println( c.getManyToMany() );
    System.out.println( c.getComponents() );
    System.out.println( c.getComposites() );
    assertTrue( c.getComponents().size()==1 ); //WAS: 2
    assertTrue( c.getComposites().size()==2 );
    assertTrue( ( (Container.ContainerInnerClass) c.getComponents().get(0) ).getName().equals("a different name") );
    Iterator iter = c.getComposites().iterator();
    boolean found = false;
    while ( iter.hasNext() ) {
      if ( ( (Container.ContainerInnerClass) iter.next() ).getName().equals("once again") ) found = true;
    }
    assertTrue(found);
    c.getOneToMany().clear();
    c.getManyToMany().clear();
    c.getComposites().clear();
    c.getComponents().clear();
    doDelete( s, "from Simple" );
    doDelete( s, "from Many" );
    doDelete( s, "from One" );
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    c = (Container) s.load( Container.class, new Long( c.getId() ) );
    assertTrue( c.getComponents().size()==0 );
    assertTrue( c.getComposites().size()==0 );
    assertTrue( c.getOneToMany().size()==0 );
    assertTrue( c.getManyToMany().size()==0 );
    s.delete(c);
    t.commit();
    s.close();
  }

  public void testCascadeCompositeElements() throws Exception {
    Container c = new Container();
    List list = new ArrayList();
    c.setCascades(list);
    Container.ContainerInnerClass cic = new Container.ContainerInnerClass();
    cic.setMany( new Many() );
    cic.setOne( new One() );
    list.add(cic);
    Session s = openSession();
    s.beginTransaction();
    s.save(c);
    s.getTransaction().commit();
    s.close();
   
    s=openSession();
    s.beginTransaction();
    c = (Container) s.createQuery( "from ContainerX c" ).iterate().next();
    cic = (Container.ContainerInnerClass) c.getCascades().iterator().next();
    assertTrue( cic.getMany()!=null && cic.getOne()!=null );
    assertTrue( c.getCascades().size()==1 );
    s.delete(c);
    s.getTransaction().commit();
    s.close();

    c = new Container();
    s = openSession();
    s.beginTransaction();
    s.save(c);
    list = new ArrayList();
    c.setCascades(list);
    cic = new Container.ContainerInnerClass();
    cic.setMany( new Many() );
    cic.setOne( new One() );
    list.add(cic);
    s.getTransaction().commit();
    s.close();
   
    s=openSession();
    s.beginTransaction();
    c = (Container) s.createQuery( "from ContainerX c" ).iterate().next();
    cic = (Container.ContainerInnerClass) c.getCascades().iterator().next();
    assertTrue( cic.getMany()!=null && cic.getOne()!=null );
    assertTrue( c.getCascades().size()==1 );
    s.delete(c);
    s.getTransaction().commit();
    s.close();
  }

  public void testBag() throws Exception {
    Session s = openSession();
    Transaction t = s.beginTransaction();
    Container c = new Container();
    Contained c1 = new Contained();
    Contained c2 = new Contained();
    c.setBag( new ArrayList() );
    c.getBag().add(c1);
    c.getBag().add(c2);
    c1.getBag().add(c);
    c2.getBag().add(c);
    s.save(c);
    c.getBag().add(c2);
    c2.getBag().add(c);
    c.getLazyBag().add(c1);
    c1.getLazyBag().add(c);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    c = (Container) s.createQuery( "from ContainerX c" ).list().get(0);
    c.getLazyBag().size();
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    c = (Container) s.createQuery( "from ContainerX c" ).list().get(0);
    Contained c3 = new Contained();
    //c.getBag().add(c3);
    //c3.getBag().add(c);
    c.getLazyBag().add(c3);
    c3.getLazyBag().add(c);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    c = (Container) s.createQuery( "from ContainerX c" ).list().get(0);
    Contained c4 = new Contained();
    c.getLazyBag().add(c4);
    c4.getLazyBag().add(c);
    assertTrue( c.getLazyBag().size()==3 ); //forces initialization
    //s.save(c4);
    t.commit();
    s.close();

    s = openSession();
    t = s.beginTransaction();
    c = (Container) s.createQuery( "from ContainerX c" ).list().get(0);
    Iterator i = c.getBag().iterator();
    int j=0;
    while ( i.hasNext() ) {
      assertTrue( i.next()!=null );
      j++;
    }
    assertTrue(j==3);
    assertTrue( c.getLazyBag().size()==3 );
    s.delete(c);
    c.getBag().remove(c2);
    Iterator iter = c.getBag().iterator();
    j=0;
    while ( iter.hasNext() ) {
      j++;
      s.delete( iter.next() );
    }
    assertTrue(j==2);
    s.delete( s.load(Contained.class, new Long( c4.getId() ) ) );
    s.delete( s.load(Contained.class, new Long( c3.getId() ) ) );
    t.commit();
    s.close();
  }

  public void testCircularCascade() throws Exception {
    Session s = openSession();
    Transaction tx = s.beginTransaction();
    Circular c = new Circular();
    c.setClazz(Circular.class);
    c.setOther( new Circular() );
    c.getOther().setOther( new Circular() );
    c.getOther().getOther().setOther(c);
    c.setAnyEntity( c.getOther() );
    String id = (String) s.save(c);
    tx.commit();
    s.close();
    s = openSession();
    tx = s.beginTransaction();
    c = (Circular) s.load(Circular.class, id);
    c.getOther().getOther().setClazz(Foo.class);
    tx.commit();
    s.close();
    c.getOther().setClazz(Qux.class);
    s = openSession();
    tx = s.beginTransaction();
    s.saveOrUpdate(c);
    tx.commit();
    s.close();
    c.getOther().getOther().setClazz(Bar.class);
    s = openSession();
    tx = s.beginTransaction();
    s.saveOrUpdate(c);
    tx.commit();
    s.close();
    s = openSession();
    tx = s.beginTransaction();
    c = (Circular) s.load(Circular.class, id);
    assertTrue( c.getOther().getOther().getClazz()==Bar.class);
    assertTrue( c.getOther().getClazz()==Qux.class);
    assertTrue( c.getOther().getOther().getOther()==c);
    assertTrue( c.getAnyEntity()==c.getOther() );
    assertEquals( 3, doDelete( s, "from Universe" ) );
    tx.commit();
    s.close();
  }

  public void testDeleteEmpty() throws Exception {
    Session s = openSession();
    s.beginTransaction();
    assertEquals( 0, doDelete( s, "from Simple" ) );
    assertEquals( 0, doDelete( s, "from Universe" ) );
    s.getTransaction().commit();
    s.close();
  }

  public void testLocking() throws Exception {
    Session s = openSession();
    Transaction tx = s.beginTransaction();
    Simple s1 = new Simple(); s1.setCount(1);
    Simple s2 = new Simple(); s2.setCount(2);
    Simple s3 = new Simple(); s3.setCount(3);
    Simple s4 = new Simple(); s4.setCount(4);
    s.save(s1, new Long(1) );
    s.save(s2, new Long(2) );
    s.save(s3, new Long(3) );
    s.save(s4, new Long(4) );
    assertTrue( s.getCurrentLockMode(s1)==LockMode.WRITE );
    tx.commit();
    s.close();

    s = openSession();
    tx = s.beginTransaction();
    s1 = (Simple) s.load(Simple.class, new Long(1), LockMode.NONE);
    assertTrue( s.getCurrentLockMode(s1)==LockMode.READ || s.getCurrentLockMode(s1)==LockMode.NONE ); //depends if cache is enabled
    s2 = (Simple) s.load(Simple.class, new Long(2), LockMode.READ);
    assertTrue( s.getCurrentLockMode(s2)==LockMode.READ );
    s3 = (Simple) s.load(Simple.class, new Long(3), LockMode.UPGRADE);
    assertTrue( s.getCurrentLockMode(s3)==LockMode.UPGRADE );
    s4 = (Simple) s.get(Simple.class, new Long(4), LockMode.UPGRADE_NOWAIT);
    assertTrue( s.getCurrentLockMode(s4)==LockMode.UPGRADE_NOWAIT );

    s1 = (Simple) s.load(Simple.class, new Long(1), LockMode.UPGRADE); //upgrade
    assertTrue( s.getCurrentLockMode(s1)==LockMode.UPGRADE );
    s2 = (Simple) s.load(Simple.class, new Long(2), LockMode.NONE);
    assertTrue( s.getCurrentLockMode(s2)==LockMode.READ );
    s3 = (Simple) s.load(Simple.class, new Long(3), LockMode.READ);
    assertTrue( s.getCurrentLockMode(s3)==LockMode.UPGRADE );
    s4 = (Simple) s.load(Simple.class, new Long(4), LockMode.UPGRADE);
    assertTrue( s.getCurrentLockMode(s4)==LockMode.UPGRADE_NOWAIT );

    s.lock(s2, LockMode.UPGRADE); //upgrade
    assertTrue( s.getCurrentLockMode(s2)==LockMode.UPGRADE );
    s.lock(s3, LockMode.UPGRADE);
    assertTrue( s.getCurrentLockMode(s3)==LockMode.UPGRADE );
    s.lock(s1, LockMode.UPGRADE_NOWAIT);
    s.lock(s4, LockMode.NONE);
    assertTrue( s.getCurrentLockMode(s4)==LockMode.UPGRADE_NOWAIT );

    tx.commit();
    tx = s.beginTransaction();

    assertTrue( s.getCurrentLockMode(s3)==LockMode.NONE );
    assertTrue( s.getCurrentLockMode(s1)==LockMode.NONE );
    assertTrue( s.getCurrentLockMode(s2)==LockMode.NONE );
    assertTrue( s.getCurrentLockMode(s4)==LockMode.NONE );

    s.lock(s1, LockMode.READ); //upgrade
    assertTrue( s.getCurrentLockMode(s1)==LockMode.READ );
    s.lock(s2, LockMode.UPGRADE); //upgrade
    assertTrue( s.getCurrentLockMode(s2)==LockMode.UPGRADE );
    s.lock(s3, LockMode.UPGRADE_NOWAIT); //upgrade
    assertTrue( s.getCurrentLockMode(s3)==LockMode.UPGRADE_NOWAIT );
    s.lock(s4, LockMode.NONE);
    assertTrue( s.getCurrentLockMode(s4)==LockMode.NONE );

    s4.setName("s4");
    s.flush();
    assertTrue( s.getCurrentLockMode(s4)==LockMode.WRITE );
    tx.commit();

    tx = s.beginTransaction();

    assertTrue( s.getCurrentLockMode(s3)==LockMode.NONE );
    assertTrue( s.getCurrentLockMode(s1)==LockMode.NONE );
    assertTrue( s.getCurrentLockMode(s2)==LockMode.NONE );
    assertTrue( s.getCurrentLockMode(s4)==LockMode.NONE );

    s.delete(s1); s.delete(s2); s.delete(s3); s.delete(s4);
    tx.commit();
    s.close();
  }

  public void testObjectType() throws Exception {
    Session s = openSession();
    s.beginTransaction();
    Parent g = new Parent();
    Foo foo = new Foo();
    g.setAny(foo);
    s.save(g);
    s.save(foo);
    s.getTransaction().commit();
    s.close();

    s = openSession();
    s.beginTransaction();
    g = (Parent) s.load( Parent.class, new Long( g.getId() ) );
    assertTrue( g.getAny()!=null && g.getAny() instanceof FooProxy );
    s.delete( g.getAny() );
    s.delete(g);
    s.getTransaction().commit();
    s.close();
  }

  public void testLoadAfterNonExists() throws HibernateException, SQLException {
    Session session = openSession();
    if ( ( getDialect() instanceof MySQLDialect ) || ( getDialect() instanceof IngresDialect ) ) {
      session.connection().setTransactionIsolation( Connection.TRANSACTION_READ_COMMITTED );
    }
    session.getTransaction().begin();

    // First, prime the fixture session to think the entity does not exist
    try {
      session.load( Simple.class, new Long(-1) );
      fail();
    }
    catch(ObjectNotFoundException onfe) {
      // this is correct
    }

    // Next, lets create that entity "under the covers"
    Session anotherSession = getSessions().openSession();
    anotherSession.beginTransaction();
    Simple myNewSimple = new Simple();
    myNewSimple.setName("My under the radar Simple entity");
    myNewSimple.setAddress("SessionCacheTest.testLoadAfterNonExists");
    myNewSimple.setCount(1);
    myNewSimple.setDate( new Date() );
    myNewSimple.setPay( new Float(100000000) );
    anotherSession.save( myNewSimple, new Long(-1) );
    anotherSession.getTransaction().commit();
    anotherSession.close();

    // Now, lets make sure the original session can see the created row...
    session.clear();
    try {
      Simple dummy = (Simple) session.get( Simple.class, new Long(-1) );
      assertNotNull("Unable to locate entity Simple with id = -1", dummy);
      session.delete( dummy );
    }
    catch(ObjectNotFoundException onfe) {
      fail("Unable to locate entity Simple with id = -1");
    }
    session.getTransaction().commit();
    session.close();
  }

}
TOP

Related Classes of org.hibernate.test.legacy.ParentChildTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.