[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