package org.hibernate.test.instrument.cases;
import junit.framework.TestCase;
import org.hibernate.CacheMode;
import org.hibernate.Hibernate;
import org.hibernate.LockMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.test.instrument.domain.Document;
import org.hibernate.test.instrument.domain.Folder;
import org.hibernate.test.instrument.domain.Owner;
/**
* @author Steve Ebersole
*/
public class TestLazyExecutable extends AbstractExecutable {
public void execute() {
// The following block is repeated 100 times to reproduce HHH-2627.
// Without the fix, Oracle will run out of cursors using 10g with
// a default installation (ORA-01000: maximum open cursors exceeded).
// The number of loops may need to be adjusted depending on the how
// Oracle is configured.
// Note: The block is not indented to avoid a lot of irrelevant differences.
for ( int i=0; i<100; i++ ) {
SessionFactory factory = getFactory();
Session s = factory.openSession();
Transaction t = s.beginTransaction();
Owner o = new Owner();
Document doc = new Document();
Folder fol = new Folder();
o.setName("gavin");
doc.setName("Hibernate in Action");
doc.setSummary("blah");
doc.updateText("blah blah");
fol.setName("books");
doc.setOwner(o);
doc.setFolder(fol);
fol.getDocuments().add(doc);
s.save(o);
s.save(fol);
t.commit();
s.close();
s = factory.openSession();
s.setCacheMode( CacheMode.IGNORE );
t = s.beginTransaction();
doc = ( Document ) s.get( Document.class, doc.getId() );
TestCase.assertTrue( Hibernate.isPropertyInitialized(doc, "weirdProperty"));
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "name"));
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "upperCaseName"));
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "folder"));
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "owner"));
doc.getUpperCaseName(); // should force initialization
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text"));
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty"));
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "upperCaseName"));
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "folder"));
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "owner"));
t.commit();
s.close();
s = factory.openSession();
s.setCacheMode( CacheMode.IGNORE );
t = s.beginTransaction();
doc = (Document) s.createQuery("from Document").uniqueResult();
doc.getName();
TestCase.assertEquals( doc.getText(), "blah blah" );
t.commit();
s.close();
s = factory.openSession();
s.setCacheMode( CacheMode.IGNORE );
t = s.beginTransaction();
doc = (Document) s.createQuery("from Document").uniqueResult();
doc.getName();
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "summary"));
TestCase.assertEquals( doc.getText(), "blah blah" );
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text"));
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "summary"));
t.commit();
s.close();
s = factory.openSession();
s.setCacheMode( CacheMode.IGNORE );
t = s.beginTransaction();
doc = (Document) s.createQuery("from Document").uniqueResult();
doc.setName("HiA");
t.commit();
s.close();
s = factory.openSession();
s.setCacheMode( CacheMode.IGNORE );
t = s.beginTransaction();
doc = (Document) s.createQuery("from Document").uniqueResult();
TestCase.assertEquals( doc.getName(), "HiA" );
TestCase.assertEquals( doc.getText(), "blah blah" );
t.commit();
s.close();
s = factory.openSession();
s.setCacheMode( CacheMode.IGNORE );
t = s.beginTransaction();
doc = (Document) s.createQuery("from Document").uniqueResult();
doc.getText();
doc.setName("HiA second edition");
t.commit();
s.close();
s = factory.openSession();
s.setCacheMode( CacheMode.IGNORE );
t = s.beginTransaction();
doc = (Document) s.createQuery("from Document").uniqueResult();
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty"));
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "name"));
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "upperCaseName"));
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "owner"));
TestCase.assertEquals( doc.getName(), "HiA second edition" );
TestCase.assertEquals( doc.getText(), "blah blah" );
TestCase.assertEquals( doc.getUpperCaseName(), "HIA SECOND EDITION" );
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text"));
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty"));
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "upperCaseName"));
t.commit();
s.close();
s = factory.openSession();
s.setCacheMode( CacheMode.IGNORE );
t = s.beginTransaction();
doc = (Document) s.createQuery("from Document").uniqueResult();
t.commit();
s.close();
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
s = factory.openSession();
s.setCacheMode( CacheMode.IGNORE );
t = s.beginTransaction();
s.lock(doc, LockMode.NONE);
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
TestCase.assertEquals( doc.getText(), "blah blah" );
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text"));
t.commit();
s.close();
s = factory.openSession();
s.setCacheMode( CacheMode.IGNORE );
t = s.beginTransaction();
doc = (Document) s.createQuery("from Document").uniqueResult();
t.commit();
s.close();
doc.setName("HiA2");
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
s = factory.openSession();
s.setCacheMode( CacheMode.IGNORE );
t = s.beginTransaction();
s.saveOrUpdate(doc);
s.flush();
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
TestCase.assertEquals( doc.getText(), "blah blah" );
TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text"));
doc.updateText("blah blah blah blah");
t.commit();
s.close();
s = factory.openSession();
s.setCacheMode( CacheMode.IGNORE );
t = s.beginTransaction();
doc = ( Document ) s.createQuery("from Document").uniqueResult();
TestCase.assertEquals( doc.getName(), "HiA2" );
TestCase.assertEquals( doc.getText(), "blah blah blah blah" );
t.commit();
s.close();
s = factory.openSession();
s.setCacheMode( CacheMode.IGNORE );
t = s.beginTransaction();
doc = (Document) s.load( Document.class, doc.getId() );
doc.getName();
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "summary"));
t.commit();
s.close();
s = factory.openSession();
s.setCacheMode( CacheMode.IGNORE );
t = s.beginTransaction();
doc = (Document) s.createQuery("from Document").uniqueResult();
//s.delete(doc);
s.delete( doc.getFolder() );
s.delete( doc.getOwner() );
s.flush();
t.commit();
s.close();
}
}
}