/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.test.bytecode.enhancement.otherentityentrycontext; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Environment; import org.hibernate.engine.spi.ManagedEntity; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.test.bytecode.enhancement.AbstractEnhancerTestTask; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; /** * This task tests ManagedEntity objects that are already associated with a different PersistenceContext. * * @author Gail Badner */ public class OtherEntityEntryContextTestTask extends AbstractEnhancerTestTask { public Class<?>[] getAnnotatedClasses() { return new Class<?>[] {Parent.class}; } public void prepare() { Configuration cfg = new Configuration(); cfg.setProperty( Environment.ENABLE_LAZY_LOAD_NO_TRANS, "true" ); cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "false" ); super.prepare( cfg ); // Create a Parent Session s = getFactory().openSession(); s.beginTransaction(); s.persist( new Parent( 1, "first" ) ); s.getTransaction().commit(); s.close(); } public void execute() { Session s1 = getFactory().openSession(); s1.beginTransaction(); Parent p = (Parent) s1.get( Parent.class, 1 ); assertTrue( ManagedEntity.class.isInstance( p ) ); p.setName( "second" ); assertTrue( s1.contains( p ) ); // open another session and evict p from the new session Session s2 = getFactory().openSession(); s2.beginTransaction(); // s2 should contains no entities assertFalse( s2.contains( p ) ); // evict should do nothing, since p is not associated with s2 s2.evict( p ); assertFalse( s2.contains( p ) ); assertNull( ( (SharedSessionContractImplementor) s2 ).getPersistenceContext().getEntry( p ) ); try { s2.update( p ); fail( "should have failed because p is already associated with a PersistenceContext that is still open." ); } catch (HibernateException expected) { // expected s2.getTransaction().rollback(); s2.close(); } s1.getTransaction().commit(); s1.close(); p.setName( "third" ); s1 = getFactory().openSession(); s1.getTransaction().begin(); s1.update( p ); assertTrue( s1.contains( p ) ); s1.evict( p ); assertFalse( s1.contains( p ) ); p = s1.get( Parent.class, p.getId() ); assertEquals( "second", p.getName() ); s1.getTransaction().commit(); s1.close(); } protected void cleanup() { } }