[hibernate-commits] Hibernate SVN: r10845 - in trunk/Hibernate3: src/org/hibernate src/org/hibernate/impl test/org/hibernate/test/sql

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Nov 17 23:20:32 EST 2006


Author: steve.ebersole at jboss.com
Date: 2006-11-17 23:20:30 -0500 (Fri, 17 Nov 2006)
New Revision: 10845

Modified:
   trunk/Hibernate3/src/org/hibernate/SQLQuery.java
   trunk/Hibernate3/src/org/hibernate/impl/SQLQueryImpl.java
   trunk/Hibernate3/test/org/hibernate/test/sql/GeneralTest.java
Log:
HHH-2130 : SQLQuery + query space synchronization

Modified: trunk/Hibernate3/src/org/hibernate/SQLQuery.java
===================================================================
--- trunk/Hibernate3/src/org/hibernate/SQLQuery.java	2006-11-17 22:15:26 UTC (rev 10844)
+++ trunk/Hibernate3/src/org/hibernate/SQLQuery.java	2006-11-18 04:20:30 UTC (rev 10845)
@@ -60,4 +60,34 @@
 	 * Use a predefined named ResultSetMapping
 	 */
 	public SQLQuery setResultSetMapping(String name);
+
+	/**
+	 * Adds a query space for auto-flush synchronization.
+	 *
+	 * @param querySpace The query space to be auto-flushed for this query.
+	 * @return this, for method chaning
+	 */
+	public SQLQuery addSynchronizedQuerySpace(String querySpace);
+
+	/**
+	 * Adds an entity name or auto-flush synchronization.
+	 *
+	 * @param entityName The name of the entity upon whose defined
+	 * query spaces we should additionally synchronize.
+	 * @return this, for method chaning
+	 * @throws MappingException Indicates the given entity name could not be
+	 * resolved.
+	 */
+	public SQLQuery addSynchronizedEntityName(String entityName) throws MappingException;
+
+	/**
+	 * Adds an entity name or auto-flush synchronization.
+	 *
+	 * @param entityClass The class of the entity upon whose defined
+	 * query spaces we should additionally synchronize.
+	 * @return this, for method chaning
+	 * @throws MappingException Indicates the given entity class could not be
+	 * resolved.
+	 */
+	public SQLQuery addSynchronizedEntityClass(Class entityClass) throws MappingException;
 }

Modified: trunk/Hibernate3/src/org/hibernate/impl/SQLQueryImpl.java
===================================================================
--- trunk/Hibernate3/src/org/hibernate/impl/SQLQueryImpl.java	2006-11-17 22:15:26 UTC (rev 10844)
+++ trunk/Hibernate3/src/org/hibernate/impl/SQLQueryImpl.java	2006-11-18 04:20:30 UTC (rev 10845)
@@ -7,6 +7,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.io.Serializable;
 
 import org.hibernate.FlushMode;
 import org.hibernate.HibernateException;
@@ -47,7 +48,7 @@
 public class SQLQueryImpl extends AbstractQueryImpl implements SQLQuery {
 
 	private final List queryReturns;
-	private final Collection querySpaces;
+	private Collection querySpaces;
 	private final boolean callable;
 	private boolean autodiscovertypes;
 
@@ -56,6 +57,7 @@
 	 *
 	 * @param queryDef The representation of the defined <sql-query/>.
 	 * @param session The session to which this SQLQueryImpl belongs.
+	 * @param parameterMetadata Metadata about parameters found in the query.
 	 */
 	SQLQueryImpl(NamedSQLQueryDefinition queryDef, SessionImplementor session, ParameterMetadata parameterMetadata) {
 		super( queryDef.getQueryString(), queryDef.getFlushMode(), session, parameterMetadata );
@@ -65,7 +67,7 @@
 			if (definition == null) {
 				throw new MappingException(
 						"Unable to find resultset-ref definition: " +
-						queryDef.getResultSetRef() 
+						queryDef.getResultSetRef()
 					);
 			}
 			this.queryReturns = Arrays.asList( definition.getQueryReturns() );
@@ -125,16 +127,16 @@
 	        ParameterMetadata parameterMetadata) {
 		this( sql, returnAliases, returnClasses, null, session, null, null, parameterMetadata );
 	}
-	
+
 	SQLQueryImpl(String sql, SessionImplementor session, ParameterMetadata parameterMetadata) {
 		super( sql, null, session, parameterMetadata );
 		queryReturns = new ArrayList();
 		querySpaces = null;
 		callable = false;
 	}
-	
+
 	private static final NativeSQLQueryReturn[] NO_SQL_RETURNS = new NativeSQLQueryReturn[0];
-	
+
 	private NativeSQLQueryReturn[] getQueryReturns() {
 		return ( NativeSQLQueryReturn[] ) queryReturns.toArray( NO_SQL_RETURNS );
 	}
@@ -223,11 +225,11 @@
 	public Type[] getReturnTypes() throws HibernateException {
 		throw new UnsupportedOperationException("not yet implemented for SQL queries");
 	}
-	
+
 	public Query setLockMode(String alias, LockMode lockMode) {
 		throw new UnsupportedOperationException("cannot set the lock mode for a native SQL query");
 	}
-	
+
 	protected Map getLockModes() {
 		//we never need to apply locks to the SQL
 		return CollectionHelper.EMPTY_MAP;
@@ -263,7 +265,7 @@
 	public SQLQuery addEntity(String alias, Class entityClass) {
 		return addEntity( alias, entityClass.getName() );
 	}
-	
+
 	public SQLQuery addJoin(String alias, String path, LockMode lockMode) {
 		int loc = path.indexOf('.');
 		if ( loc < 0 ) {
@@ -296,7 +298,35 @@
 		}
 		return this;
 	}
-	
+
+	public SQLQuery addSynchronizedQuerySpace(String querySpace) {
+		if ( querySpaces == null ) {
+			querySpaces = new ArrayList();
+		}
+		querySpaces.add( querySpace );
+		return this;
+	}
+
+	public SQLQuery addSynchronizedEntityName(String entityName) {
+		return addQuerySpaces( getSession().getFactory().getEntityPersister( entityName ).getQuerySpaces() );
+	}
+
+	public SQLQuery addSynchronizedEntityClass(Class entityClass) {
+		return addQuerySpaces( getSession().getFactory().getEntityPersister( entityClass.getName() ).getQuerySpaces() );
+	}
+
+	private SQLQuery addQuerySpaces(Serializable[] spaces) {
+		if ( spaces != null ) {
+			if ( querySpaces == null ) {
+				querySpaces = new ArrayList();
+			}
+			for ( int i = 0; i < spaces.length; i++ ) {
+				querySpaces.add( spaces[i] );
+			}
+		}
+		return this;
+	}
+
 	public int executeUpdate() throws HibernateException {
 		Map namedParams = getNamedParams();
 		return getSession().executeNativeUpdate(generateQuerySpecification( namedParams ), getQueryParameters( namedParams ));

Modified: trunk/Hibernate3/test/org/hibernate/test/sql/GeneralTest.java
===================================================================
--- trunk/Hibernate3/test/org/hibernate/test/sql/GeneralTest.java	2006-11-17 22:15:26 UTC (rev 10844)
+++ trunk/Hibernate3/test/org/hibernate/test/sql/GeneralTest.java	2006-11-18 04:20:30 UTC (rev 10845)
@@ -15,6 +15,8 @@
 import org.hibernate.Query;
 import org.hibernate.Session;
 import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
 import org.hibernate.test.TestCase;
 import org.hibernate.transform.DistinctRootEntityResultTransformer;
 import org.hibernate.transform.Transformers;
@@ -28,6 +30,19 @@
 		super( x );
 	}
 
+	public static Test suite() {
+		return new TestSuite(GeneralTest.class);
+	}
+
+	protected String[] getMappings() {
+		return new String[] { "sql/General.hbm.xml" };
+	}
+
+	protected void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
 	protected String getOrganizationFetchJoinEmploymentSQL() {
 		return "SELECT org.ORGID as {org.id}, " +
 		       "        org.NAME as {org.name}, " +
@@ -67,11 +82,6 @@
 		       "    join PERSON pers on pers.PERID = emp.EMPLOYEE ";
 	}
 
-
-	protected String[] getMappings() {
-		return new String[] { "sql/General.hbm.xml" };
-	}
-
 	public void testFailOnNoAddEntityOrScalar() {
 		// Note: this passes, but for the wrong reason.
 		//      there is actually an exception thrown, but it is the database
@@ -92,6 +102,30 @@
 		}
 	}
 
+	public void testManualSynchronization() {
+		Session s = openSession();
+		s.beginTransaction();
+
+		sfi().getStatistics().clear();
+
+		// create an Organization...
+		Organization jboss = new Organization( "JBoss" );
+		s.persist( jboss );
+
+		// now query on Employment, this should not cause an auto-flush
+		s.createSQLQuery( getEmploymentSQL() ).list();
+		assertEquals( 0, sfi().getStatistics().getEntityInsertCount() );
+
+		// now try to query on Employment but this time add Organization as a synchronized query space...
+		s.createSQLQuery( getEmploymentSQL() ).addSynchronizedEntityClass( Organization.class ).list();
+		assertEquals( 1, sfi().getStatistics().getEntityInsertCount() );
+
+		// clean up
+		s.delete( jboss );
+		s.getTransaction().commit();
+		s.close();
+	}
+
 	public void testSQLQueryInterface() {
 		Session s = openSession();
 		Transaction t = s.beginTransaction();
@@ -372,7 +406,7 @@
 				"        {prod_orders}.orgid as orgid3_1_,\r\n" +
 				"        {prod_orders}.ordernumber as ordernum2_3_1_,\r\n" +
 				"        product.name as {product.name}," +
-				"        {prod_orders.element.*}," +
+				"        {prod_orders.element.*}" +
 				/*"        orders.PROD_NO as PROD4_3_1_,\r\n" +
 				"        orders.person as person3_1_,\r\n" +
 				"        orders.PROD_ORGID as PROD3_0__,\r\n" +
@@ -399,14 +433,14 @@
 	public void testAutoDetectAliasing() {
 		Session s = openSession();
 		Transaction t = s.beginTransaction();
-		Organization ifa = new Organization( "IFA" );
-		Organization jboss = new Organization( "JBoss" );
-		Person gavin = new Person( "Gavin" );
-		Employment emp = new Employment( gavin, jboss, "AU" );
-		Serializable orgId = s.save( jboss );
-		Serializable orgId2 = s.save( ifa );
-		s.save( gavin );
-		s.save( emp );
+		Organization ifa = new Organization("IFA");
+		Organization jboss = new Organization("JBoss");
+		Person gavin = new Person("Gavin");
+		Employment emp = new Employment(gavin, jboss, "AU");
+		Serializable orgId = s.save(jboss);
+		Serializable orgId2 = s.save(ifa);
+		s.save(gavin);
+		s.save(emp);
 		t.commit();
 		s.close();
 
@@ -415,53 +449,50 @@
 		List list = s.createSQLQuery( getEmploymentSQL() )
 				.addEntity( Employment.class.getName() )
 				.list();
-		assertEquals( 1, list.size() );
+		assertEquals( 1,list.size() );
 
-		Employment emp2 = ( Employment ) list.get( 0 );
-		assertEquals( emp2.getEmploymentId(), emp.getEmploymentId() );
-		assertEquals( emp2.getStartDate().getDate(), emp.getStartDate().getDate() );
-		assertEquals( emp2.getEndDate(), emp.getEndDate() );
+		Employment emp2 = (Employment) list.get(0);
+		assertEquals(emp2.getEmploymentId(), emp.getEmploymentId() );
+		assertEquals(emp2.getStartDate().getDate(), emp.getStartDate().getDate() );
+		assertEquals(emp2.getEndDate(), emp.getEndDate() );
 
 		s.clear();
 
 		list = s.createSQLQuery( getEmploymentSQL() )
-				.addEntity( Employment.class.getName() )
-				.setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP )
-				.list();
-		assertEquals( 1, list.size() );
-		Map m = ( Map ) list.get( 0 );
-		assertTrue( m.containsKey( "Employment" ) );
-		assertEquals( 1, m.size() );
+		.addEntity( Employment.class.getName() )
+		.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)
+		.list();
+		assertEquals( 1,list.size() );
+		Map m = (Map) list.get(0);
+		assertTrue(m.containsKey("Employment"));
+		assertEquals(1,m.size());
 
-		list = s.createSQLQuery( getEmploymentSQL() ).list();
-		assertEquals( 1, list.size() );
-		Object[] o = ( Object[] ) list.get( 0 );
-		assertEquals( 8, o.length );
+		list = s.createSQLQuery(getEmploymentSQL()).list();
+		assertEquals(1, list.size());
+		Object[] o = (Object[]) list.get(0);
+		assertEquals(8, o.length);
 
-		list = s.createSQLQuery( getEmploymentSQL() ).setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP ).list();
-		assertEquals( 1, list.size() );
-		m = ( Map ) list.get( 0 );
-		assertTrue( m.containsKey( "EMPID" ) );
-		assertTrue( m.containsKey( "VALUE" ) );
-		assertTrue( m.containsKey( "ENDDATE" ) );
-		assertEquals( 8, m.size() );
+		list = s.createSQLQuery(getEmploymentSQL()).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
+		assertEquals(1, list.size());
+		m = (Map) list.get(0);
+		assertTrue(m.containsKey("EMPID"));
+		assertTrue(m.containsKey("VALUE"));
+		assertTrue(m.containsKey("ENDDATE"));
+		assertEquals(8, m.size());
 
-		list =
-				s.createSQLQuery( getEmploymentSQLMixedScalarEntity() )
-						.addScalar( "employerid" )
-						.addEntity( Employment.class )
-						.list();
-		assertEquals( 1, list.size() );
-		o = ( Object[] ) list.get( 0 );
-		assertEquals( 2, o.length );
-		assertClassAssignability( o[0].getClass(), Number.class );
-		assertClassAssignability( o[1].getClass(), Employment.class );
+		list = s.createSQLQuery( getEmploymentSQLMixedScalarEntity() ).addScalar( "employerid" ).addEntity( Employment.class ).list();
+		assertEquals(1, list.size());
+		o = (Object[]) list.get(0);
+		assertEquals(2, o.length);
+		assertClassAssignability( o[0].getClass(), Number.class);
+		assertClassAssignability( o[1].getClass(), Employment.class);
 
 
-		Query queryWithCollection = s.getNamedQuery( "organizationEmploymentsExplicitAliases" );
-		queryWithCollection.setLong( "id", jboss.getId() );
+
+		Query queryWithCollection = s.getNamedQuery("organizationEmploymentsExplicitAliases");
+		queryWithCollection.setLong("id",  jboss.getId() );
 		list = queryWithCollection.list();
-		assertEquals( list.size(), 1 );
+		assertEquals(list.size(),1);
 
 		s.clear();
 
@@ -469,7 +500,7 @@
 				.addEntity( "org", Organization.class )
 				.addJoin( "emp", "org.employments" )
 				.list();
-		assertEquals( 2, list.size() );
+		assertEquals( 2,list.size() );
 
 		s.clear();
 
@@ -477,30 +508,30 @@
 				.addEntity( "org", Organization.class )
 				.addJoin( "emp", "org.employments" )
 				.list();
-		assertEquals( 2, list.size() );
+		assertEquals( 2,list.size() );
 
 		s.clear();
 
 		// TODO : why twice?
 		s.getNamedQuery( "organizationreturnproperty" ).list();
 		list = s.getNamedQuery( "organizationreturnproperty" ).list();
-		assertEquals( 2, list.size() );
+		assertEquals( 2,list.size() );
 
 		s.clear();
 
 		list = s.getNamedQuery( "organizationautodetect" ).list();
-		assertEquals( 2, list.size() );
+		assertEquals( 2,list.size() );
 
 		t.commit();
 		s.close();
 
 		s = openSession();
 		t = s.beginTransaction();
-		s.delete( emp2 );
+		s.delete(emp2);
 
-		s.delete( jboss );
-		s.delete( gavin );
-		s.delete( ifa );
+		s.delete(jboss);
+		s.delete(gavin);
+		s.delete(ifa);
 		t.commit();
 		s.close();
 
@@ -508,9 +539,7 @@
 		t = s.beginTransaction();
 		Dimension dim = new Dimension( 3, Integer.MAX_VALUE );
 		s.save( dim );
-		list =
-				s.createSQLQuery( "select d_len * d_width as surface, d_len * d_width * 10 as volume from Dimension" )
-						.list();
+		list = s.createSQLQuery( "select d_len * d_width as surface, d_len * d_width * 10 as volume from Dimension" ).list();
 		s.delete( dim );
 		t.commit();
 		s.close();
@@ -521,17 +550,18 @@
 		enterprise.setModel( "USS" );
 		enterprise.setName( "Entreprise" );
 		enterprise.setSpeed( 50d );
-		Dimension d = new Dimension( 45, 10 );
+		Dimension d = new Dimension(45, 10);
 		enterprise.setDimensions( d );
 		s.save( enterprise );
-		Object[] result = ( Object[] ) s.getNamedQuery( "spaceship" ).uniqueResult();
-		enterprise = ( SpaceShip ) result[0];
-		assertTrue( 50d == enterprise.getSpeed() );
+		Object[] result = (Object[]) s.getNamedQuery( "spaceship" ).uniqueResult();
+		enterprise = (SpaceShip) result[0];
+		assertTrue(50d == enterprise.getSpeed() );
 		assertTrue( 450d == extractDoubleValue( result[1] ) );
 		assertTrue( 4500d == extractDoubleValue( result[2] ) );
 		s.delete( enterprise );
 		t.commit();
 		s.close();
+
 	}
 
 	public void testMixAndMatchEntityScalar() {
@@ -565,8 +595,4 @@
 		}
 	}
 
-	public static Test suite() {
-		return new TestSuite(GeneralTest.class);
-	}
-
 }




More information about the hibernate-commits mailing list