/* * 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.loadplans.process; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.hibernate.Hibernate; import org.hibernate.Session; import org.hibernate.engine.spi.QueryParameters; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.jdbc.Work; import org.hibernate.loader.plan.exec.process.spi.ResultSetProcessor; import org.hibernate.loader.plan.exec.query.spi.NamedParameterContext; import org.hibernate.loader.plan.exec.spi.LoadQueryDetails; import org.hibernate.loader.plan.spi.LoadPlan; import org.hibernate.persister.entity.EntityPersister; import org.junit.Test; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; import org.hibernate.testing.junit4.ExtraAssertions; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; /** * @author Gail Badner */ public class EntityWithNonLazyOneToManyListResultSetProcessorTest extends BaseCoreFunctionalTestCase { @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] { Poster.class, Message.class }; } @Test public void testEntityWithList() throws Exception { final EntityPersister entityPersister = sessionFactory().getEntityPersister( Poster.class.getName() ); // create some test data Session session = openSession(); session.beginTransaction(); Poster poster = new Poster(); poster.pid = 0; poster.name = "John Doe"; Message message1 = new Message(); message1.mid = 1; message1.msgTxt = "Howdy!"; message1.poster = poster; poster.messages.add( message1 ); Message message2 = new Message(); message2.mid = 2; message2.msgTxt = "Bye!"; message2.poster = poster; poster.messages.add( message2 ); session.save( poster ); session.getTransaction().commit(); session.close(); // session = openSession(); // session.beginTransaction(); // Poster posterGotten = (Poster) session.get( Poster.class, poster.pid ); // assertEquals( 0, posterGotten.pid.intValue() ); // assertEquals( poster.name, posterGotten.name ); // assertTrue( Hibernate.isInitialized( posterGotten.messages ) ); // assertEquals( 2, posterGotten.messages.size() ); // assertEquals( message1.msgTxt, posterGotten.messages.get( 0 ).msgTxt ); // assertEquals( message2.msgTxt, posterGotten.messages.get( 1 ).msgTxt ); // assertSame( posterGotten, posterGotten.messages.get( 0 ).poster ); // assertSame( posterGotten, posterGotten.messages.get( 1 ).poster ); // session.getTransaction().commit(); // session.close(); { final LoadPlan plan = Helper.INSTANCE.buildLoadPlan( sessionFactory(), entityPersister ); final LoadQueryDetails queryDetails = Helper.INSTANCE.buildLoadQueryDetails( plan, sessionFactory() ); final String sql = queryDetails.getSqlStatement(); final ResultSetProcessor resultSetProcessor = queryDetails.getResultSetProcessor(); final List results = new ArrayList(); final Session workSession = openSession(); workSession.beginTransaction(); workSession.doWork( new Work() { @Override public void execute(Connection connection) throws SQLException { PreparedStatement ps = connection.prepareStatement( sql ); ps.setInt( 1, 0 ); ResultSet resultSet = ps.executeQuery(); results.addAll( resultSetProcessor.extractResults( resultSet, (SessionImplementor) workSession, new QueryParameters(), new NamedParameterContext() { @Override public int[] getNamedParameterLocations(String name) { return new int[0]; } }, true, false, null, null ) ); resultSet.close(); ps.close(); } } ); assertEquals( 2, results.size() ); Object result1 = results.get( 0 ); assertNotNull( result1 ); assertSame( result1, results.get( 1 ) ); Poster workPoster = ExtraAssertions.assertTyping( Poster.class, result1 ); assertEquals( 0, workPoster.pid.intValue() ); assertEquals( poster.name, workPoster.name ); assertTrue( Hibernate.isInitialized( workPoster.messages ) ); assertEquals( 2, workPoster.messages.size() ); assertTrue( Hibernate.isInitialized( workPoster.messages ) ); assertEquals( 2, workPoster.messages.size() ); assertEquals( message1.msgTxt, workPoster.messages.get( 0 ).msgTxt ); assertEquals( message2.msgTxt, workPoster.messages.get( 1 ).msgTxt ); assertSame( workPoster, workPoster.messages.get( 0 ).poster ); assertSame( workPoster, workPoster.messages.get( 1 ).poster ); workSession.getTransaction().commit(); workSession.close(); } // clean up test data session = openSession(); session.beginTransaction(); session.delete( poster ); session.getTransaction().commit(); session.close(); } @Entity( name = "Message" ) public static class Message { @Id private Integer mid; private String msgTxt; @ManyToOne @JoinColumn private Poster poster; } @Entity( name = "Poster" ) public static class Poster { @Id private Integer pid; private String name; @OneToMany(mappedBy = "poster", fetch = FetchType.EAGER, cascade = CascadeType.ALL ) private List<Message> messages = new ArrayList<Message>(); } }