Hibernate SVN: r20084 - search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-07-30 06:08:42 -0400 (Fri, 30 Jul 2010)
New Revision: 20084
Modified:
search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/JBossTSTest.java
Log:
HSEARCH-562 Add JTA test with JBoss TS: Set tx timeout to infinity and clean test
Modified: search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/JBossTSTest.java
===================================================================
--- search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/JBossTSTest.java 2010-07-30 10:08:05 UTC (rev 20083)
+++ search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/JBossTSTest.java 2010-07-30 10:08:42 UTC (rev 20084)
@@ -10,6 +10,7 @@
import javax.sql.DataSource;
import javax.sql.XADataSource;
+import com.arjuna.ats.arjuna.coordinator.TxControl;
import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple;
import com.arjuna.ats.jdbc.TransactionalDriver;
import org.junit.AfterClass;
@@ -36,7 +37,7 @@
@BeforeClass
public static void setUp() throws Exception {
-
+ TxControl.setDefaultTimeout(0);
H2dataSourceProvider dsProvider = new H2dataSourceProvider();
final XADataSource h2DataSource = dsProvider.getDataSource( dsProvider.getDataSourceName() );
XADataSourceWrapper dsw = new XADataSourceWrapper(
@@ -66,6 +67,7 @@
)
.addProperty( "hibernate.dialect", H2Dialect.class.getName() )
.addProperty( Environment.HBM2DDL_AUTO, "create-drop" )
+ .addProperty( Environment.SHOW_SQL, "true" )
.create();
final HibernatePersistence hp = new HibernatePersistence();
factory = hp.createContainerEntityManagerFactory( unitInfo, new HashMap( ) );
@@ -79,23 +81,23 @@
@Test
public void testJBossTS() throws Exception {
- TransactionManagerImple transaction = new TransactionManagerImple();
- transaction.begin();;
+ TransactionManagerImple tm = new TransactionManagerImple();
+ tm.begin();
EntityManager em = factory.createEntityManager();
- em.persist( new Tweet("Spice is the essence of life") );
+ Tweet tweet = new Tweet( "Spice is the essence of life" );
+ em.persist( tweet );
em.flush();
- transaction.commit();
+ tm.commit();
em.close();
-
- transaction.begin();
+ tm.begin();
em = factory.createEntityManager();
final List resultList = em.createQuery( "from " + Tweet.class.getName() ).getResultList();
Assert.assertEquals( 1, resultList.size() );
for (Object o : resultList) {
em.remove( o );
}
- transaction.commit();
+ tm.commit();
em.close();
}
13 years, 7 months
Hibernate SVN: r20083 - in search/trunk/hibernate-search-integrationtest/src/test: resources and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-07-30 06:08:05 -0400 (Fri, 30 Jul 2010)
New Revision: 20083
Added:
search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/JBossTSTest.java
search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/Tweet.java
Modified:
search/trunk/hibernate-search-integrationtest/src/test/resources/persistence.xml
Log:
HSEARCH-562 Add JTA test with JBoss TS: Add unit test
Use a friendly id generator not involving several connections to the database
Make constructor public for entity
Added: search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/JBossTSTest.java
===================================================================
--- search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/JBossTSTest.java (rev 0)
+++ search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/JBossTSTest.java 2010-07-30 10:08:05 UTC (rev 20083)
@@ -0,0 +1,102 @@
+package org.hibernate.search.test.integration.jbossjta;
+
+import java.util.HashMap;
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.SharedCacheMode;
+import javax.persistence.ValidationMode;
+import javax.persistence.spi.PersistenceUnitTransactionType;
+import javax.sql.DataSource;
+import javax.sql.XADataSource;
+
+import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple;
+import com.arjuna.ats.jdbc.TransactionalDriver;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.hibernate.cfg.Environment;
+import org.hibernate.dialect.H2Dialect;
+import org.hibernate.ejb.HibernatePersistence;
+import org.hibernate.search.test.integration.jbossjta.infra.H2dataSourceProvider;
+import org.hibernate.search.test.integration.jbossjta.infra.JBossTSStandaloneTransactionManagerLookup;
+import org.hibernate.search.test.integration.jbossjta.infra.PersistenceUnitInfoBuilder;
+import org.hibernate.search.test.integration.jbossjta.infra.ReadOnlyPersistenceUnitInfo;
+import org.hibernate.search.test.integration.jbossjta.infra.XADataSourceWrapper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+
+public class JBossTSTest {
+
+ private static EntityManagerFactory factory;
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+
+ H2dataSourceProvider dsProvider = new H2dataSourceProvider();
+ final XADataSource h2DataSource = dsProvider.getDataSource( dsProvider.getDataSourceName() );
+ XADataSourceWrapper dsw = new XADataSourceWrapper(
+ dsProvider.getDataSourceName(),
+ h2DataSource
+ );
+ dsw.setProperty( TransactionalDriver.dynamicClass, H2dataSourceProvider.class.getName() );
+ dsw.setProperty( TransactionalDriver.userName, "sa" );
+ dsw.setProperty( TransactionalDriver.password, "" );
+
+ PersistenceUnitInfoBuilder pub = new PersistenceUnitInfoBuilder();
+ final ReadOnlyPersistenceUnitInfo unitInfo = pub
+ .setExcludeUnlistedClasses( true )
+ .setJtaDataSource( dsw )
+ //.setJtaDataSource( ( DataSource) h2DataSource )
+ .setPersistenceProviderClassName( HibernatePersistence.class.getName() )
+ .setPersistenceUnitName( "jbossjta" )
+ .setPersistenceXMLSchemaVersion( "2.0" )
+ .setSharedCacheMode( SharedCacheMode.NONE )
+ .setValidationMode( ValidationMode.NONE )
+ .setTransactionType( PersistenceUnitTransactionType.JTA )
+ .addManagedClassNames( Tweet.class.getName() )
+ //.addProperty( "hibernate.transaction.factory_class", null )
+ .addProperty(
+ "hibernate.transaction.manager_lookup_class",
+ JBossTSStandaloneTransactionManagerLookup.class.getName()
+ )
+ .addProperty( "hibernate.dialect", H2Dialect.class.getName() )
+ .addProperty( Environment.HBM2DDL_AUTO, "create-drop" )
+ .create();
+ final HibernatePersistence hp = new HibernatePersistence();
+ factory = hp.createContainerEntityManagerFactory( unitInfo, new HashMap( ) );
+
+ }
+
+ @AfterClass
+ public static void tearDown() {
+ factory.close();
+ }
+
+ @Test
+ public void testJBossTS() throws Exception {
+ TransactionManagerImple transaction = new TransactionManagerImple();
+ transaction.begin();;
+ EntityManager em = factory.createEntityManager();
+ em.persist( new Tweet("Spice is the essence of life") );
+ em.flush();
+ transaction.commit();
+ em.close();
+
+
+ transaction.begin();
+ em = factory.createEntityManager();
+ final List resultList = em.createQuery( "from " + Tweet.class.getName() ).getResultList();
+ Assert.assertEquals( 1, resultList.size() );
+ for (Object o : resultList) {
+ em.remove( o );
+ }
+ transaction.commit();
+
+ em.close();
+ }
+}
Added: search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/Tweet.java
===================================================================
--- search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/Tweet.java (rev 0)
+++ search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/Tweet.java 2010-07-30 10:08:05 UTC (rev 20083)
@@ -0,0 +1,33 @@
+package org.hibernate.search.test.integration.jbossjta;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.GenericGenerator;
+
+/**
+ * @author Emmanuel Bernard
+ */
+@Entity
+public class Tweet {
+ public Tweet() {};
+
+ public Tweet(String tweet) {
+ this.text = tweet;
+ }
+
+ @Id
+ @GeneratedValue(generator = "uuid")
+ @GenericGenerator( name = "uuid", strategy = "uuid")
+ public String getId() { return id; }
+ public void setId(String id) { this.id = id; }
+ private String id;
+
+ @Column(name="tweet_text")
+ public String getText() { return text; };
+ public void setText(String text) { this.text = text; }
+ private String text;
+}
Modified: search/trunk/hibernate-search-integrationtest/src/test/resources/persistence.xml
===================================================================
--- search/trunk/hibernate-search-integrationtest/src/test/resources/persistence.xml 2010-07-30 10:07:26 UTC (rev 20082)
+++ search/trunk/hibernate-search-integrationtest/src/test/resources/persistence.xml 2010-07-30 10:08:05 UTC (rev 20083)
@@ -7,4 +7,11 @@
<class>org.hibernate.search.test.integration.jtaspring.Doughnut</class>
<class>org.hibernate.search.test.integration.jtaspring.Muffin</class>
</persistence-unit>
+
+ <persistence-unit name="jbossjta" transaction-type="JTA">
+ <provider>org.hibernate.ejb.HibernatePersistence</provider>
+ <properties>
+ <property name="" value=""/>
+ </properties>
+ </persistence-unit>
</persistence>
13 years, 7 months
Hibernate SVN: r20082 - in search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration: jbossjta and 1 other directories.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-07-30 06:07:26 -0400 (Fri, 30 Jul 2010)
New Revision: 20082
Added:
search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/
search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/
search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/DataSourceByNameProvider.java
search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/H2dataSourceProvider.java
search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/JBossTSStandaloneTransactionManagerLookup.java
search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/PersistenceUnitInfoBuilder.java
search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/ReadOnlyPersistenceUnitInfo.java
search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/XADataSourceWrapper.java
Log:
HSEARCH-562 Add JTA test with JBoss TS: Add infrastructural code for JBossTS
In particular:
- PersistenceUnitInfo builder to use Hibernate's EMF creation "in container"
- XADatasourceWrapper that does not use JNDI but use a static lookup mechanism
- create datasource holder for H2
- create JBossTSStandaloneTransactionManagerLookup (to be contributed to Hibernate Core?)
Added: search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/DataSourceByNameProvider.java
===================================================================
--- search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/DataSourceByNameProvider.java (rev 0)
+++ search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/DataSourceByNameProvider.java 2010-07-30 10:07:26 UTC (rev 20082)
@@ -0,0 +1,28 @@
+package org.hibernate.search.test.integration.jbossjta.infra;
+
+import java.sql.SQLException;
+import javax.sql.XADataSource;
+
+import com.arjuna.ats.internal.jdbc.DynamicClass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DataSourceByNameProvider implements DynamicClass {
+ private final XADataSource datasource;
+ private final String name;
+
+ public DataSourceByNameProvider(String name, XADataSource datasource) {
+ this.name = name;
+ this.datasource = datasource;
+ }
+
+ public XADataSource getDataSource(String dbName) throws SQLException {
+ if ( name.equals( dbName ) ) {
+ return datasource;
+ }
+ else {
+ throw new IllegalArgumentException( "Datasource not found: " + dbName );
+ }
+ }
+}
\ No newline at end of file
Added: search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/H2dataSourceProvider.java
===================================================================
--- search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/H2dataSourceProvider.java (rev 0)
+++ search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/H2dataSourceProvider.java 2010-07-30 10:07:26 UTC (rev 20082)
@@ -0,0 +1,33 @@
+package org.hibernate.search.test.integration.jbossjta.infra;
+
+import java.sql.SQLException;
+import javax.sql.XADataSource;
+
+import com.arjuna.ats.internal.jdbc.DynamicClass;
+import org.h2.jdbcx.JdbcDataSource;
+
+/**
+ * Bind a H2 DataSource to the name "h2"
+ *
+ * @author Emmanuel Bernard
+ */
+public class H2dataSourceProvider implements DynamicClass {
+ private static String DATASOURCE_NAME = "h2";
+ private static DynamicClass dynamicClass;
+
+ static {
+ final JdbcDataSource dataSource = new JdbcDataSource();
+ dataSource.setURL( "jdbc:h2:file:h2db" );
+ dataSource.setUser( "sa" );
+ dataSource.setPassword( "" );
+ dynamicClass = new DataSourceByNameProvider( DATASOURCE_NAME, dataSource );
+ }
+
+ public String getDataSourceName() {
+ return DATASOURCE_NAME;
+ }
+
+ public XADataSource getDataSource(String dbName) throws SQLException {
+ return dynamicClass.getDataSource( dbName );
+ }
+}
Added: search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/JBossTSStandaloneTransactionManagerLookup.java
===================================================================
--- search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/JBossTSStandaloneTransactionManagerLookup.java (rev 0)
+++ search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/JBossTSStandaloneTransactionManagerLookup.java 2010-07-30 10:07:26 UTC (rev 20082)
@@ -0,0 +1,29 @@
+package org.hibernate.search.test.integration.jbossjta.infra;
+
+import java.util.Properties;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+
+import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple;
+import org.jboss.tm.TransactionManagerFactory;
+
+import org.hibernate.HibernateException;
+import org.hibernate.transaction.TransactionManagerLookup;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JBossTSStandaloneTransactionManagerLookup implements TransactionManagerLookup {
+ public TransactionManager getTransactionManager(Properties props) throws HibernateException {
+ //TODO use reflection
+ return new TransactionManagerImple();
+ }
+
+ public String getUserTransactionName() {
+ return null;
+ }
+
+ public Object getTransactionIdentifier(Transaction transaction) {
+ return transaction;
+ }
+}
Added: search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/PersistenceUnitInfoBuilder.java
===================================================================
--- search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/PersistenceUnitInfoBuilder.java (rev 0)
+++ search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/PersistenceUnitInfoBuilder.java 2010-07-30 10:07:26 UTC (rev 20082)
@@ -0,0 +1,109 @@
+package org.hibernate.search.test.integration.jbossjta.infra;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import javax.persistence.SharedCacheMode;
+import javax.persistence.ValidationMode;
+import javax.persistence.spi.PersistenceUnitTransactionType;
+import javax.sql.DataSource;
+
+public class PersistenceUnitInfoBuilder {
+ private String persistenceUnitName;
+ private String persistenceProviderClassName;
+ private PersistenceUnitTransactionType transactionType;
+ private DataSource jtaDataSource;
+ private URL persistenceUnitRootUrl;
+ private List<String> managedClassNames;
+ private boolean excludeUnlistedClasses;
+ private SharedCacheMode sharedCacheMode;
+ private ValidationMode validationMode;
+ private Properties properties;
+ private String persistenceXMLSchemaVersion;
+ private ClassLoader classLoader;
+
+ public PersistenceUnitInfoBuilder() {
+ classLoader = Thread.currentThread().getContextClassLoader();
+ persistenceUnitRootUrl = classLoader.getResource( "persistence.xml" );
+ managedClassNames = new ArrayList<String>();
+ properties = new Properties( );
+ }
+
+ public PersistenceUnitInfoBuilder setPersistenceUnitName(String persistenceUnitName) {
+ this.persistenceUnitName = persistenceUnitName;
+ return this;
+ }
+
+ public PersistenceUnitInfoBuilder setPersistenceProviderClassName(String persistenceProviderClassName) {
+ this.persistenceProviderClassName = persistenceProviderClassName;
+ return this;
+ }
+
+ public PersistenceUnitInfoBuilder setTransactionType(PersistenceUnitTransactionType transactionType) {
+ this.transactionType = transactionType;
+ return this;
+ }
+
+ public PersistenceUnitInfoBuilder setJtaDataSource(DataSource jtaDataSource) {
+ this.jtaDataSource = jtaDataSource;
+ return this;
+ }
+
+ public PersistenceUnitInfoBuilder setPersistenceUnitRootUrl(URL persistenceUnitRootUrl) {
+ this.persistenceUnitRootUrl = persistenceUnitRootUrl;
+ return this;
+ }
+
+ public PersistenceUnitInfoBuilder addManagedClassNames(String managedClassName) {
+ this.managedClassNames.add( managedClassName );
+ return this;
+ }
+
+ public PersistenceUnitInfoBuilder setExcludeUnlistedClasses(boolean excludeUnlistedClasses) {
+ this.excludeUnlistedClasses = excludeUnlistedClasses;
+ return this;
+ }
+
+ public PersistenceUnitInfoBuilder setSharedCacheMode(SharedCacheMode sharedCacheMode) {
+ this.sharedCacheMode = sharedCacheMode;
+ return this;
+ }
+
+ public PersistenceUnitInfoBuilder setValidationMode(ValidationMode validationMode) {
+ this.validationMode = validationMode;
+ return this;
+ }
+
+ public PersistenceUnitInfoBuilder addProperty(String key, String value) {
+ this.properties.setProperty( key, value );
+ return this;
+ }
+
+ public PersistenceUnitInfoBuilder setPersistenceXMLSchemaVersion(String persistenceXMLSchemaVersion) {
+ this.persistenceXMLSchemaVersion = persistenceXMLSchemaVersion;
+ return this;
+ }
+
+ public PersistenceUnitInfoBuilder setClassLoader(ClassLoader classLoader) {
+ this.classLoader = classLoader;
+ return this;
+ }
+
+ public ReadOnlyPersistenceUnitInfo create() {
+ return new ReadOnlyPersistenceUnitInfo(
+ persistenceUnitName,
+ persistenceProviderClassName,
+ transactionType,
+ jtaDataSource,
+ persistenceUnitRootUrl,
+ managedClassNames,
+ excludeUnlistedClasses,
+ sharedCacheMode,
+ validationMode,
+ properties,
+ persistenceXMLSchemaVersion,
+ classLoader
+ );
+ }
+}
\ No newline at end of file
Added: search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/ReadOnlyPersistenceUnitInfo.java
===================================================================
--- search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/ReadOnlyPersistenceUnitInfo.java (rev 0)
+++ search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/ReadOnlyPersistenceUnitInfo.java 2010-07-30 10:07:26 UTC (rev 20082)
@@ -0,0 +1,112 @@
+package org.hibernate.search.test.integration.jbossjta.infra;
+
+import java.net.URL;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+import javax.persistence.SharedCacheMode;
+import javax.persistence.ValidationMode;
+import javax.persistence.spi.ClassTransformer;
+import javax.persistence.spi.PersistenceUnitInfo;
+import javax.persistence.spi.PersistenceUnitTransactionType;
+import javax.sql.DataSource;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ReadOnlyPersistenceUnitInfo implements PersistenceUnitInfo {
+ private final String persistenceUnitName;
+ private final String persistenceProviderClassName;
+ private final PersistenceUnitTransactionType transactionType;
+ private final DataSource jtaDataSource;
+ private final URL persistenceUnitRootUrl;
+ private final List<String> managedClassNames;
+ private final boolean excludeUnlistedClasses;
+ private final SharedCacheMode sharedCacheMode;
+ private final ValidationMode validationMode;
+ private final Properties properties;
+ private final String persistenceXMLSchemaVersion;
+ private final ClassLoader classLoader;
+
+ public ReadOnlyPersistenceUnitInfo(String persistenceUnitName, String persistenceProviderClassName, PersistenceUnitTransactionType transactionType, DataSource jtaDataSource, URL persistenceUnitRootUrl, List<String> managedClassNames, boolean excludeUnlistedClasses, SharedCacheMode sharedCacheMode, ValidationMode validationMode, Properties properties, String persistenceXMLSchemaVersion, ClassLoader classLoader) {
+ this.persistenceUnitName = persistenceUnitName;
+ this.persistenceProviderClassName = persistenceProviderClassName;
+ this.transactionType = transactionType;
+ this.jtaDataSource = jtaDataSource;
+ this.persistenceUnitRootUrl = persistenceUnitRootUrl;
+ this.managedClassNames = managedClassNames;
+ this.excludeUnlistedClasses = excludeUnlistedClasses;
+ this.sharedCacheMode = sharedCacheMode;
+ this.validationMode = validationMode;
+ this.properties = properties;
+ this.persistenceXMLSchemaVersion = persistenceXMLSchemaVersion;
+ this.classLoader = classLoader;
+ }
+
+ public String getPersistenceUnitName() {
+ return persistenceUnitName;
+ }
+
+ public String getPersistenceProviderClassName() {
+ return persistenceProviderClassName;
+ }
+
+ public PersistenceUnitTransactionType getTransactionType() {
+ return transactionType;
+ }
+
+ public DataSource getJtaDataSource() {
+ return jtaDataSource;
+ }
+
+ public DataSource getNonJtaDataSource() {
+ return null;
+ }
+
+ public List<String> getMappingFileNames() {
+ return Collections.EMPTY_LIST;
+ }
+
+ public List<URL> getJarFileUrls() {
+ return Collections.EMPTY_LIST;
+ }
+
+ public URL getPersistenceUnitRootUrl() {
+ return persistenceUnitRootUrl;
+ }
+
+ public List<String> getManagedClassNames() {
+ return managedClassNames;
+ }
+
+ public boolean excludeUnlistedClasses() {
+ return excludeUnlistedClasses;
+ }
+
+ public SharedCacheMode getSharedCacheMode() {
+ return sharedCacheMode;
+ }
+
+ public ValidationMode getValidationMode() {
+ return validationMode;
+ }
+
+ public Properties getProperties() {
+ return properties;
+ }
+
+ public String getPersistenceXMLSchemaVersion() {
+ return persistenceXMLSchemaVersion;
+ }
+
+ public ClassLoader getClassLoader() {
+ return classLoader;
+ }
+
+ public void addTransformer(ClassTransformer transformer) {
+ }
+
+ public ClassLoader getNewTempClassLoader() {
+ return null;
+ }
+}
Added: search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/XADataSourceWrapper.java
===================================================================
--- search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/XADataSourceWrapper.java (rev 0)
+++ search/trunk/hibernate-search-integrationtest/src/test/java/org/hibernate/search/test/integration/jbossjta/infra/XADataSourceWrapper.java 2010-07-30 10:07:26 UTC (rev 20082)
@@ -0,0 +1,194 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * (C) 2008,
+ * @author JBoss Inc.
+ */
+package org.hibernate.search.test.integration.jbossjta.infra;
+
+import javax.sql.XADataSource;
+import javax.sql.XAConnection;
+import javax.sql.DataSource;
+import javax.naming.Context;
+import java.sql.SQLException;
+import java.sql.Connection;
+import java.io.PrintWriter;
+import java.util.Properties;
+
+import com.arjuna.ats.jdbc.TransactionalDriver;
+import com.arjuna.ats.jdbc.common.jdbcPropertyManager;
+//import com.arjuna.common.util.propertyservice.PropertyManager;
+
+
+/**
+ * This class provides a DataSource based approach to
+ * management of transaction aware database connections.
+ * <p/>
+ * It's a XADataSource from which they can obtain a XAResource.
+ * Hence it implements both DataSource and XADataSource.
+ *
+ * @author Jonathan Halliday jonathan.halliday(a)redhat.com
+ * @author Emmanuel Bernard
+ * @since 2008-05
+ */
+public class XADataSourceWrapper implements XADataSource, DataSource {
+ private XADataSource _theXADataSource;
+ private final TransactionalDriver _theTransactionalDriver = new TransactionalDriver();
+ private String _name;
+ private Properties defaultProperties = new Properties();
+
+ /**
+ * Create a wrapper around the provided XADataSource implementation,
+ * which should be registered in tomcat's global JNDI with the specified name.
+ * Note: the registration is not done here, it's someone elses problem.
+ * See TransactionalResourceFactory for example usage.
+ *
+ * @param name should be the fully qualifed JNDI name of the XADataSource, in
+ * tomcat's global JNDI, not a webapp specific JNDI context.
+ * @param theDataSource
+ */
+ public XADataSourceWrapper(String name, XADataSource theDataSource) {
+ _theXADataSource = theDataSource;
+ _name = name;
+ }
+
+ public void setProperty(String key, String value) {
+ defaultProperties.setProperty( key, value );
+ }
+
+ /**
+ * Obtain a direct reference to the wrapped object. This is not
+ * recommended but may be necessary to e.g. call vendor specific methods.
+ *
+ * @return
+ */
+ public XADataSource getUnwrappedXADataSource() {
+ return _theXADataSource;
+ }
+
+ ///////////////////////
+
+ // Implementation of the DataSource API is done by reusing the arjuna
+ // TransactionalDriver. Its already got all the smarts for checking tx
+ // context, enlisting resources etc so we just delegate to it.
+ // All we need is some fudging to make the JNDI name stuff behave.
+
+ /**
+ * Obtain a connection to the database.
+ * Note: Pooling behaviour depends on the vendor's underlying XADataSource implementation.
+ *
+ * @return
+ *
+ * @throws SQLException
+ */
+ public Connection getConnection() throws SQLException {
+ String url = TransactionalDriver.arjunaDriver + _name;
+ // although we are not setting any properties, the driver will barf if we pass 'null'.
+ Properties properties = new Properties(defaultProperties);
+ return getTransactionalConnection( url, properties );
+ }
+
+ /**
+ * Obtain a connection to the database using the supplied authentication credentials.
+ *
+ * @param username
+ * @param password
+ *
+ * @return
+ *
+ * @throws SQLException
+ */
+ public Connection getConnection(String username, String password) throws SQLException {
+ String url = TransactionalDriver.arjunaDriver + _name;
+ Properties properties = new Properties(defaultProperties);
+ properties.setProperty( TransactionalDriver.userName, username );
+ properties.setProperty( TransactionalDriver.password, password );
+ return getTransactionalConnection( url, properties );
+ }
+
+ /*
+ * This is where most of the tomcat specific weirdness resides. You probably
+ * want to subclass and override this method for reuse in env other than tomcat.
+ */
+
+ protected Connection getTransactionalConnection(String url, Properties properties) throws SQLException {
+ /*
+ // For ref, the url the TransactionalDriver expects is the arjuna driver's
+ // special prefix followed by a JNDI name.
+ // via ConnectionImple the IndirectRecoverableConnection.createDataSource method
+ // attempts to look it up in JNDI. There are two problems with this:
+
+ // First problem,
+ // it always calls InitialContext(env), never InitalContext().
+ // This we work around by copying into the arjuna config, the system
+ // properties it needs to populate the env:
+
+ // caution: ensure the tx lifecycle listener is configured in tomcat or there will be a
+ // possible race here, as recovery needs these properties too and may start first
+ jdbcPropertyManager.propertyManager.setProperty("Context.INITIAL_CONTEXT_FACTORY", System.getProperty(Context.INITIAL_CONTEXT_FACTORY));
+ jdbcPropertyManager.propertyManager.setProperty("Context.URL_PKG_PREFIXES", System.getProperty(Context.URL_PKG_PREFIXES));
+ */
+
+ Connection connection;
+ connection = _theTransactionalDriver.connect( url, properties );
+ return connection;
+ }
+
+ ///////////////////////
+
+ // Implementation of XADataSource API is just a straightforward wrap/delegate.
+ // Note that some of these methods also appear in the DataSource API.
+ // We don't really care, it's the underlying implementations problem
+ // to disambiguate them if required.
+
+ public boolean isWrapperFor(Class<?> iface) throws SQLException {
+ return iface.isAssignableFrom( XADataSource.class );
+ }
+
+ public <T> T unwrap(Class<T> iface) throws SQLException {
+ if ( isWrapperFor( iface ) ) {
+ return ( T ) getUnwrappedXADataSource();
+ }
+ else {
+ throw new SQLException( "Not a wrapper for " + iface.getCanonicalName() );
+ }
+ }
+
+ public XAConnection getXAConnection() throws SQLException {
+ return _theXADataSource.getXAConnection();
+ }
+
+ public XAConnection getXAConnection(String user, String password) throws SQLException {
+ return _theXADataSource.getXAConnection( user, password );
+ }
+
+ public PrintWriter getLogWriter() throws SQLException {
+ return _theXADataSource.getLogWriter();
+ }
+
+ public void setLogWriter(PrintWriter out) throws SQLException {
+ _theXADataSource.setLogWriter( out );
+ }
+
+ public void setLoginTimeout(int seconds) throws SQLException {
+ _theXADataSource.setLoginTimeout( seconds );
+ }
+
+ public int getLoginTimeout() throws SQLException {
+ return _theXADataSource.getLoginTimeout();
+ }
+}
13 years, 7 months
Hibernate SVN: r20081 - search/trunk/hibernate-search-integrationtest.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-07-30 06:06:43 -0400 (Fri, 30 Jul 2010)
New Revision: 20081
Modified:
search/trunk/hibernate-search-integrationtest/pom.xml
Log:
HSEARCH-562 Add JTA test with JBoss TS: Add JBoss TS dependency
Modified: search/trunk/hibernate-search-integrationtest/pom.xml
===================================================================
--- search/trunk/hibernate-search-integrationtest/pom.xml 2010-07-30 06:11:46 UTC (rev 20080)
+++ search/trunk/hibernate-search-integrationtest/pom.xml 2010-07-30 10:06:43 UTC (rev 20081)
@@ -36,6 +36,13 @@
<dependencies>
+ <!-- JBoss TS -->
+ <dependency>
+ <groupId>org.jboss.jbossts</groupId>
+ <artifactId>jbossjta</artifactId>
+ <version>4.11.0.Final</version>
+ </dependency>
+
<!-- Hibernate -->
<dependency>
<groupId>${groupId}</groupId>
13 years, 7 months
Hibernate SVN: r20080 - entitymanager/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/ejb/test.
by hibernate-commits@lists.jboss.org
Author: stliu
Date: 2010-07-30 02:11:46 -0400 (Fri, 30 Jul 2010)
New Revision: 20080
Modified:
entitymanager/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/ejb/test/PackagedEntityManagerTest.java
Log:
JBPAPP-4760 clean db tables after each test
Modified: entitymanager/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/ejb/test/PackagedEntityManagerTest.java
===================================================================
--- entitymanager/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/ejb/test/PackagedEntityManagerTest.java 2010-07-30 03:39:45 UTC (rev 20079)
+++ entitymanager/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/ejb/test/PackagedEntityManagerTest.java 2010-07-30 06:11:46 UTC (rev 20080)
@@ -37,20 +37,10 @@
* @author Gavin King
*/
@SuppressWarnings("unchecked")
-public class PackagedEntityManagerTest extends TestCase {
+public class PackagedEntityManagerTest extends junit.framework.TestCase {
- public Class[] getAnnotatedClasses() {
- return new Class[] {Item.class,Distributor.class
- };
- }
-
- @Override
- protected void buildConfiguration() throws Exception {
- super.buildConfiguration();
- factory = Persistence.createEntityManagerFactory( "manager1" );
- }
-
public void testDefaultPar() throws Exception {
+
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "defaultpar", new HashMap() );
EntityManager em = emf.createEntityManager();
ApplicationServer as = new ApplicationServer();
@@ -358,7 +348,48 @@
em.getTransaction().rollback();
em.close();
}
+ private EntityManagerFactory factory;
+ private EntityManager em;
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ factory = Persistence.createEntityManagerFactory( "manager1" );
+ }
+ @Override
+ protected void tearDown() throws Exception {
+ handleUnclosedResources();
+ }
+
+ protected void handleUnclosedResources() {
+ try {
+ cleanUnclosed( this.em );
+ } catch ( Exception ignore ) {
+ }
+ if(factory!=null){
+ factory.close();
+ factory=null;
+ }
+ }
+ private void cleanUnclosed(EntityManager em) {
+ if ( em == null ) {
+ return;
+ }
+ if ( em.getTransaction().isActive() ) {
+ em.getTransaction().rollback();
+ }
+ if ( em.isOpen() ) {
+ em.close();
+ }
+ em = null;
+ }
+ protected EntityManager getOrCreateEntityManager() {
+ if ( em == null || !em.isOpen() ) {
+ em = factory.createEntityManager();
+ }
+ return em;
+ }
+
public PackagedEntityManagerTest() {
super();
}
13 years, 7 months
Hibernate SVN: r20079 - in core/branches/Branch_3_5: core/src/main/java/org/hibernate/hql and 6 other directories.
by hibernate-commits@lists.jboss.org
Author: gbadner
Date: 2010-07-29 23:39:45 -0400 (Thu, 29 Jul 2010)
New Revision: 20079
Modified:
core/branches/Branch_3_5/core/src/main/java/org/hibernate/cache/QueryKey.java
core/branches/Branch_3_5/core/src/main/java/org/hibernate/hql/HolderInstantiator.java
core/branches/Branch_3_5/core/src/main/java/org/hibernate/hql/classic/QueryTranslatorImpl.java
core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/Loader.java
core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/criteria/CriteriaLoader.java
core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/custom/CustomLoader.java
core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/hql/QueryLoader.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheNormalResultTransformerTest.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCachePutResultTransformerTest.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/QueryCacheTest.java
Log:
HHH-5424 HHH-5425 : Put ResultTransformer in QueryKey only if data is transformed; PropertyAccessException when caching 1 result per row
Modified: core/branches/Branch_3_5/core/src/main/java/org/hibernate/cache/QueryKey.java
===================================================================
--- core/branches/Branch_3_5/core/src/main/java/org/hibernate/cache/QueryKey.java 2010-07-30 03:03:41 UTC (rev 20078)
+++ core/branches/Branch_3_5/core/src/main/java/org/hibernate/cache/QueryKey.java 2010-07-30 03:39:45 UTC (rev 20079)
@@ -73,6 +73,8 @@
* @param queryParameters The query parameters
* @param filterKeys The keys of any enabled filters.
* @param session The current session.
+ * @param customTransformer The result transformer; should be
+ * null if data is not transformed before being cached.
*
* @return The generate query cache key.
*/
@@ -80,7 +82,8 @@
String queryString,
QueryParameters queryParameters,
Set filterKeys,
- SessionImplementor session) {
+ SessionImplementor session,
+ ResultTransformer customTransformer) {
// disassemble positional parameters
final int positionalParameterCount = queryParameters.getPositionalParameterTypes().length;
final Type[] types = new Type[positionalParameterCount];
@@ -134,7 +137,7 @@
maxRows,
filterKeys,
session.getEntityMode(),
- queryParameters.getResultTransformer()
+ customTransformer
);
}
Modified: core/branches/Branch_3_5/core/src/main/java/org/hibernate/hql/HolderInstantiator.java
===================================================================
--- core/branches/Branch_3_5/core/src/main/java/org/hibernate/hql/HolderInstantiator.java 2010-07-30 03:03:41 UTC (rev 20078)
+++ core/branches/Branch_3_5/core/src/main/java/org/hibernate/hql/HolderInstantiator.java 2010-07-30 03:39:45 UTC (rev 20079)
@@ -41,13 +41,16 @@
private final String[] queryReturnAliases;
public static HolderInstantiator getHolderInstantiator(ResultTransformer selectNewTransformer, ResultTransformer customTransformer, String[] queryReturnAliases) {
- if(selectNewTransformer!=null) {
- return new HolderInstantiator(selectNewTransformer, queryReturnAliases);
- } else {
- return new HolderInstantiator(customTransformer, queryReturnAliases);
- }
+ return new HolderInstantiator(
+ resolveResultTransformer( selectNewTransformer, customTransformer ),
+ queryReturnAliases
+ );
}
-
+
+ public static ResultTransformer resolveResultTransformer(ResultTransformer selectNewTransformer, ResultTransformer customTransformer) {
+ return selectNewTransformer != null ? selectNewTransformer : customTransformer;
+ }
+
public static ResultTransformer createSelectNewTransformer(Constructor constructor, boolean returnMaps, boolean returnLists) {
if ( constructor != null ) {
return new AliasToBeanConstructorResultTransformer(constructor);
@@ -65,14 +68,15 @@
static public HolderInstantiator createClassicHolderInstantiator(Constructor constructor,
ResultTransformer transformer) {
- if ( constructor != null ) {
- return new HolderInstantiator(new AliasToBeanConstructorResultTransformer(constructor), null);
- }
- else {
- return new HolderInstantiator(transformer, null);
- }
+ return new HolderInstantiator( resolveClassicResultTransformer( constructor, transformer ), null );
}
-
+
+ static public ResultTransformer resolveClassicResultTransformer(
+ Constructor constructor,
+ ResultTransformer transformer) {
+ return constructor != null ? new AliasToBeanConstructorResultTransformer( constructor ) : transformer;
+ }
+
public HolderInstantiator(
ResultTransformer transformer,
String[] queryReturnAliases
Modified: core/branches/Branch_3_5/core/src/main/java/org/hibernate/hql/classic/QueryTranslatorImpl.java
===================================================================
--- core/branches/Branch_3_5/core/src/main/java/org/hibernate/hql/classic/QueryTranslatorImpl.java 2010-07-30 03:03:41 UTC (rev 20078)
+++ core/branches/Branch_3_5/core/src/main/java/org/hibernate/hql/classic/QueryTranslatorImpl.java 2010-07-30 03:39:45 UTC (rev 20079)
@@ -979,6 +979,13 @@
throw new UnsupportedOperationException( "Not supported! Use the AST translator...");
}
+ protected ResultTransformer resolveResultTransformer(ResultTransformer resultTransformer) {
+ return HolderInstantiator.resolveClassicResultTransformer(
+ holderConstructor,
+ resultTransformer
+ );
+ }
+
protected Object getResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session)
throws SQLException, HibernateException {
row = toResultRow( row );
Modified: core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/Loader.java
===================================================================
--- core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/Loader.java 2010-07-30 03:03:41 UTC (rev 20078)
+++ core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/Loader.java 2010-07-30 03:39:45 UTC (rev 20079)
@@ -924,11 +924,31 @@
.endLoadingCollections( collectionPersister );
}
+ /**
+ * Determine the actual ResultTransformer that will be used to
+ * transform query results.
+ *
+ * @param resultTransformer the specified result transformer
+ * @return the actual result transformer
+ */
+ protected ResultTransformer resolveResultTransformer(ResultTransformer resultTransformer) {
+ return resultTransformer;
+ }
+
protected List getResultList(List results, ResultTransformer resultTransformer) throws QueryException {
return results;
}
/**
+ * Are rows transformed immediately after being read from the ResultSet?
+ * @param transformer, the specified transformer
+ * @return true, if getResultColumnOrRow() transforms the results; false, otherwise
+ */
+ protected boolean areResultSetRowsTransformedImmediately(ResultTransformer transformer) {
+ return false;
+ }
+
+ /**
* Get the actual object that is returned in the user-visible result list.
* This empty implementation merely returns its first argument. This is
* overridden by some subclasses.
@@ -2188,7 +2208,11 @@
getSQLString(),
queryParameters,
filterKeys,
- session
+ session,
+ ( areResultSetRowsTransformedImmediately( queryParameters.getResultTransformer() ) ?
+ queryParameters.getResultTransformer() :
+ null
+ )
);
if ( querySpaces == null || querySpaces.size() == 0 ) {
@@ -2210,7 +2234,7 @@
if ( result == null ) {
result = doList( session, queryParameters );
- putResultInQueryCache(
+ putResultInQueryCache(
session,
queryParameters,
resultTypes,
@@ -2220,6 +2244,7 @@
);
}
+
return getResultList( result, queryParameters.getResultTransformer() );
}
@@ -2260,6 +2285,22 @@
persistenceContext.setDefaultReadOnly( defaultReadOnlyOrig );
}
+ // If there is a result transformer, but the loader is not expecting the data to be
+ // transformed yet, then the loader expects result elements that are Object[].
+ // The problem is that StandardQueryCache.get(...) does not return a tuple when
+ // resultTypes.length == 1. The following changes the data returned from the cache
+ // to be a tuple.
+ // TODO: this really doesn't belong here, but only Loader has the information
+ // to be able to do this.
+ if ( result != null &&
+ resultTypes.length == 1 &&
+ key.getResultTransformer() == null &&
+ resolveResultTransformer( queryParameters.getResultTransformer() ) != null ) {
+ for ( int i = 0 ; i < result.size() ; i++ ) {
+ result.set( i, new Object[] { result.get( i ) } );
+ }
+ }
+
if ( factory.getStatistics().isStatisticsEnabled() ) {
if ( result == null ) {
factory.getStatisticsImplementor()
@@ -2290,7 +2331,23 @@
result
);
}
- boolean put = queryCache.put( key, resultTypes, result, queryParameters.isNaturalKeyLookup(), session );
+ // If there is a result transformer, but the data has not been transformed yet,
+ // then result elements are Object[]. The problem is that StandardQueryCache.put(...)
+ // does not expect a tuple when resultTypes.length == 1. The following changes the
+ // data being cached to what StandardQueryCache.put(...) expects.
+ // TODO: this really doesn't belong here, but only Loader has the information
+ // to be able to do this.
+ List cachedResult = result;
+ if ( resultTypes.length == 1 &&
+ key.getResultTransformer() == null &&
+ resolveResultTransformer( queryParameters.getResultTransformer() ) != null ) {
+ cachedResult = new ArrayList( result.size() );
+ for ( int i = 0 ; i < result.size() ; i++ ) {
+ cachedResult.add( ( ( Object[] ) result.get( i ) )[ 0 ] );
+ }
+ }
+
+ boolean put = queryCache.put( key, resultTypes, cachedResult, queryParameters.isNaturalKeyLookup(), session );
if ( put && factory.getStatistics().isStatisticsEnabled() ) {
factory.getStatisticsImplementor()
.queryCachePut( getQueryIdentifier(), queryCache.getRegion().getName() );
@@ -2298,7 +2355,6 @@
}
}
-
private void logCachedResultDetails(ResultTransformer resultTransformer, Type[] returnTypes, List result) {
if ( ! log.isTraceEnabled() ) {
return;
Modified: core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/criteria/CriteriaLoader.java
===================================================================
--- core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/criteria/CriteriaLoader.java 2010-07-30 03:03:41 UTC (rev 20078)
+++ core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/criteria/CriteriaLoader.java 2010-07-30 03:39:45 UTC (rev 20079)
@@ -120,6 +120,16 @@
}
+ protected ResultTransformer resolveResultTransformer(ResultTransformer resultTransformer) {
+ return translator.getRootCriteria().getResultTransformer();
+ }
+
+ protected boolean areResultSetRowsTransformedImmediately( ResultTransformer transformer ) {
+ // comparing to null just in case there is no transformer
+ // (there should always be a result transformer;
+ return resolveResultTransformer( transformer ) != null;
+ }
+
protected Object getResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session)
throws SQLException, HibernateException {
final Object[] result;
@@ -145,8 +155,7 @@
result = row;
aliases = userAliases;
}
- return translator.getRootCriteria().getResultTransformer()
- .transformTuple(result, aliases);
+ return resolveResultTransformer( transformer ).transformTuple(result, aliases);
}
public Set getQuerySpaces() {
@@ -196,9 +205,9 @@
protected boolean isSubselectLoadingEnabled() {
return hasSubselectLoadableCollections();
}
-
+
protected List getResultList(List results, ResultTransformer resultTransformer) {
- return translator.getRootCriteria().getResultTransformer().transformList( results );
+ return resolveResultTransformer( resultTransformer ).transformList( results );
}
}
Modified: core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/custom/CustomLoader.java
===================================================================
--- core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/custom/CustomLoader.java 2010-07-30 03:03:41 UTC (rev 20078)
+++ core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/custom/CustomLoader.java 2010-07-30 03:39:45 UTC (rev 20079)
@@ -335,6 +335,10 @@
return new HolderInstantiator(resultTransformer, queryReturnAliases);
}
}
+
+ protected ResultTransformer resolveResultTransformer(ResultTransformer resultTransformer) {
+ return HolderInstantiator.resolveResultTransformer( null, resultTransformer );
+ }
protected Object getResultColumnOrRow(
Object[] row,
Modified: core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/hql/QueryLoader.java
===================================================================
--- core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/hql/QueryLoader.java 2010-07-30 03:03:41 UTC (rev 20078)
+++ core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/hql/QueryLoader.java 2010-07-30 03:39:45 UTC (rev 20079)
@@ -382,6 +382,10 @@
return implicitResultTransformer != null;
}
+ protected ResultTransformer resolveResultTransformer(ResultTransformer resultTransformer) {
+ return HolderInstantiator.resolveResultTransformer( implicitResultTransformer, resultTransformer );
+ }
+
protected Object getResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session)
throws SQLException, HibernateException {
Modified: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheNormalResultTransformerTest.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheNormalResultTransformerTest.java 2010-07-30 03:03:41 UTC (rev 20078)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheNormalResultTransformerTest.java 2010-07-30 03:39:45 UTC (rev 20079)
@@ -46,28 +46,4 @@
return CacheMode.NORMAL;
}
- public void testAliasToBeanDtoMultiArgList() {
- reportSkip( "Results from queries using Transformers.aliasToBean cannot be found in the cache due to bug in hashCode",
- "Query using Transformers.aliasToBean with cache"
- );
- }
- public void testAliasToBeanDtoMultiArgListFailureExpected() throws Exception {
- super.testAliasToBeanDtoMultiArgList();
- }
-
- public void testAliasToBeanDtoLiteralArgList() {
- reportSkip( "Results from queries using Transformers.aliasToBean cannot be found in the cache due to bug in hashCode",
- "Query using Transformers.aliasToBean with cache" );
- }
- public void testAliasToBeanDtoLiteralArgListFailureExpected() throws Exception {
- super.testAliasToBeanDtoLiteralArgList();
- }
-
- public void testAliasToBeanDtoWithNullAliasList() {
- reportSkip( "Results from queries using Transformers.aliasToBean cannot be found in the cache due to bug in hashCode",
- "Query using Transformers.aliasToBean with cache" );
- }
- public void testAliasToBeanDtoWithNullAliasListFailureExpected() throws Exception {
- super.testAliasToBeanDtoWithNullAliasList();
- }
-}
\ No newline at end of file
+}
Modified: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCachePutResultTransformerTest.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCachePutResultTransformerTest.java 2010-07-30 03:03:41 UTC (rev 20078)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCachePutResultTransformerTest.java 2010-07-30 03:39:45 UTC (rev 20079)
@@ -50,29 +50,4 @@
protected boolean areDynamicNonLazyAssociationsChecked() {
return false;
}
-
- public void testAliasToEntityMapOneProjectionList() {
- reportSkip( "HQL queries using a ResultTransformer are known to fail when caching a row with a single value",
- "HQL queries using a ResultTransformer has row with a single value");
- }
- public void testAliasToEntityMapOneProjectionListFailureExpected() throws Exception {
- super.testAliasToEntityMapOneProjectionList();
- }
-
- public void testAliasToBeanDtoOneArgList() {
- reportSkip( "HQL queries using a ResultTransformer are known to fail when caching a row with a single value",
- "HQL queries using a ResultTransformer has row with a single value");
- }
-
- public void testAliasToBeanDtoOneArgListFailureExpected() throws Exception {
- super.testAliasToBeanDtoOneArgList();
- }
-
- public void testOneSelectNewList() {
- reportSkip( "HQL queries using a ResultTransformer are known to fail when caching a row with a single value",
- "HQL queries using a ResultTransformer has row with a single value");
- }
- public void testOneSelectNewListFailureExpected() throws Exception {
- super.testOneSelectNewList();
- }
-}
\ No newline at end of file
+}
Modified: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/QueryCacheTest.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/QueryCacheTest.java 2010-07-30 03:03:41 UTC (rev 20078)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/QueryCacheTest.java 2010-07-30 03:39:45 UTC (rev 20079)
@@ -224,7 +224,7 @@
getSessions().evictQueries();
getSessions().getStatistics().clear();
- final String queryString = "select i.description from Item i where i.name='widget'";
+ final String queryString = "select i.description as desc from Item i where i.name='widget'";
Session s = openSession();
Transaction t = s.beginTransaction();
@@ -239,48 +239,64 @@
QueryStatistics qs = s.getSessionFactory().getStatistics().getQueryStatistics( queryString );
EntityStatistics es = s.getSessionFactory().getStatistics().getEntityStatistics( Item.class.getName() );
+ assertEquals( qs.getCacheHitCount(), 0 );
+ assertEquals( qs.getCacheMissCount(), 1 );
+ assertEquals( qs.getCachePutCount(), 1 );
+
Thread.sleep(200);
s = openSession();
t = s.beginTransaction();
List result = s.createQuery( queryString ).setCacheable(true).list();
assertEquals( result.size(), 1 );
+ assertEquals( i.getDescription(), ( ( String ) result.get( 0 ) ) );
t.commit();
s.close();
assertEquals( qs.getCacheHitCount(), 0 );
+ assertEquals( qs.getCacheMissCount(), 2 );
+ assertEquals( qs.getCachePutCount(), 2 );
s = openSession();
t = s.beginTransaction();
result = s.createQuery( queryString ).setCacheable(true).list();
assertEquals( result.size(), 1 );
+ assertEquals( i.getDescription(), result.get( 0 ) );
t.commit();
s.close();
assertEquals( qs.getCacheHitCount(), 1 );
+ assertEquals( qs.getCacheMissCount(), 2 );
+ assertEquals( qs.getCachePutCount(), 2 );
s = openSession();
t = s.beginTransaction();
result = s.createQuery( queryString ).setCacheable(true).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
assertEquals( result.size(), 1 );
Map m = (Map) result.get(0);
- assertEquals(1, m.size());
+ assertEquals( 1, m.size() );
+ assertEquals( i.getDescription(), m.get( "desc" ) );
t.commit();
s.close();
- assertEquals( "hit count should not go up since we are adding a resulttransformer", qs.getCacheHitCount(), 1 );
-
+ assertEquals( "hit count should go up since data is not transformed until after it is cached", qs.getCacheHitCount(), 2 );
+ assertEquals( qs.getCacheMissCount(), 2 );
+ assertEquals( qs.getCachePutCount(), 2 );
+
s = openSession();
t = s.beginTransaction();
result = s.createQuery( queryString ).setCacheable(true).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
assertEquals( result.size(), 1 );
m = (Map) result.get(0);
assertEquals(1, m.size());
+ assertEquals( i.getDescription(), m.get( "desc" ) );
t.commit();
s.close();
-
- assertEquals( "hit count should go up since we are using the same resulttransformer", qs.getCacheHitCount(), 2 );
-
+
+ assertEquals( "hit count should go up since data is not transformed until after it is cachedr", qs.getCacheHitCount(), 3 );
+ assertEquals( qs.getCacheMissCount(), 2 );
+ assertEquals( qs.getCachePutCount(), 2 );
+
s = openSession();
t = s.beginTransaction();
result = s.createQuery( queryString ).setCacheable(true).list();
@@ -292,8 +308,9 @@
t.commit();
s.close();
- assertEquals( qs.getCacheHitCount(), 3 );
- assertEquals( qs.getCacheMissCount(), 3 );
+ assertEquals( qs.getCacheHitCount(), 4 );
+ assertEquals( qs.getCacheMissCount(), 2 );
+ assertEquals( qs.getCachePutCount(), 2 );
Thread.sleep(200);
@@ -303,15 +320,19 @@
assertEquals( result.size(), 1 );
i = (Item) s.get( Item.class, new Long(i.getId()) );
assertEquals( (String) result.get(0), "A middle-quality widget." );
-
+
+ assertEquals( qs.getCacheHitCount(), 4 );
+ assertEquals( qs.getCacheMissCount(), 3 );
+ assertEquals( qs.getCachePutCount(), 3 );
+
s.delete(i);
t.commit();
s.close();
- assertEquals( qs.getCacheHitCount(), 3 );
- assertEquals( qs.getCacheMissCount(), 4 );
- assertEquals( qs.getCachePutCount(), 4 );
- assertEquals( qs.getExecutionCount(), 4 );
+ assertEquals( qs.getCacheHitCount(), 4 );
+ assertEquals( qs.getCacheMissCount(), 3 );
+ assertEquals( qs.getCachePutCount(), 3 );
+ assertEquals( qs.getExecutionCount(), 3 );
assertEquals( es.getFetchCount(), 0 ); //check that it was being cached
}
13 years, 7 months
Hibernate SVN: r20078 - in core/trunk: core/src/main/java/org/hibernate/hql and 6 other directories.
by hibernate-commits@lists.jboss.org
Author: gbadner
Date: 2010-07-29 23:03:41 -0400 (Thu, 29 Jul 2010)
New Revision: 20078
Modified:
core/trunk/core/src/main/java/org/hibernate/cache/QueryKey.java
core/trunk/core/src/main/java/org/hibernate/hql/HolderInstantiator.java
core/trunk/core/src/main/java/org/hibernate/hql/classic/QueryTranslatorImpl.java
core/trunk/core/src/main/java/org/hibernate/loader/Loader.java
core/trunk/core/src/main/java/org/hibernate/loader/criteria/CriteriaLoader.java
core/trunk/core/src/main/java/org/hibernate/loader/custom/CustomLoader.java
core/trunk/core/src/main/java/org/hibernate/loader/hql/QueryLoader.java
core/trunk/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheNormalResultTransformerTest.java
core/trunk/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCachePutResultTransformerTest.java
core/trunk/testsuite/src/test/java/org/hibernate/test/querycache/QueryCacheTest.java
Log:
HHH-5424 HHH-5425 : Put ResultTransformer in QueryKey only if data is transformed; PropertyAccessException when caching 1 result per row
Modified: core/trunk/core/src/main/java/org/hibernate/cache/QueryKey.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/cache/QueryKey.java 2010-07-29 21:29:48 UTC (rev 20077)
+++ core/trunk/core/src/main/java/org/hibernate/cache/QueryKey.java 2010-07-30 03:03:41 UTC (rev 20078)
@@ -73,6 +73,8 @@
* @param queryParameters The query parameters
* @param filterKeys The keys of any enabled filters.
* @param session The current session.
+ * @param customTransformer The result transformer; should be
+ * null if data is not transformed before being cached.
*
* @return The generate query cache key.
*/
@@ -80,7 +82,8 @@
String queryString,
QueryParameters queryParameters,
Set filterKeys,
- SessionImplementor session) {
+ SessionImplementor session,
+ ResultTransformer customTransformer) {
// disassemble positional parameters
final int positionalParameterCount = queryParameters.getPositionalParameterTypes().length;
final Type[] types = new Type[positionalParameterCount];
@@ -134,7 +137,7 @@
maxRows,
filterKeys,
session.getEntityMode(),
- queryParameters.getResultTransformer()
+ customTransformer
);
}
Modified: core/trunk/core/src/main/java/org/hibernate/hql/HolderInstantiator.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/hql/HolderInstantiator.java 2010-07-29 21:29:48 UTC (rev 20077)
+++ core/trunk/core/src/main/java/org/hibernate/hql/HolderInstantiator.java 2010-07-30 03:03:41 UTC (rev 20078)
@@ -41,13 +41,16 @@
private final String[] queryReturnAliases;
public static HolderInstantiator getHolderInstantiator(ResultTransformer selectNewTransformer, ResultTransformer customTransformer, String[] queryReturnAliases) {
- if(selectNewTransformer!=null) {
- return new HolderInstantiator(selectNewTransformer, queryReturnAliases);
- } else {
- return new HolderInstantiator(customTransformer, queryReturnAliases);
- }
+ return new HolderInstantiator(
+ resolveResultTransformer( selectNewTransformer, customTransformer ),
+ queryReturnAliases
+ );
}
-
+
+ public static ResultTransformer resolveResultTransformer(ResultTransformer selectNewTransformer, ResultTransformer customTransformer) {
+ return selectNewTransformer != null ? selectNewTransformer : customTransformer;
+ }
+
public static ResultTransformer createSelectNewTransformer(Constructor constructor, boolean returnMaps, boolean returnLists) {
if ( constructor != null ) {
return new AliasToBeanConstructorResultTransformer(constructor);
@@ -65,14 +68,15 @@
static public HolderInstantiator createClassicHolderInstantiator(Constructor constructor,
ResultTransformer transformer) {
- if ( constructor != null ) {
- return new HolderInstantiator(new AliasToBeanConstructorResultTransformer(constructor), null);
- }
- else {
- return new HolderInstantiator(transformer, null);
- }
+ return new HolderInstantiator( resolveClassicResultTransformer( constructor, transformer ), null );
}
-
+
+ static public ResultTransformer resolveClassicResultTransformer(
+ Constructor constructor,
+ ResultTransformer transformer) {
+ return constructor != null ? new AliasToBeanConstructorResultTransformer( constructor ) : transformer;
+ }
+
public HolderInstantiator(
ResultTransformer transformer,
String[] queryReturnAliases
Modified: core/trunk/core/src/main/java/org/hibernate/hql/classic/QueryTranslatorImpl.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/hql/classic/QueryTranslatorImpl.java 2010-07-29 21:29:48 UTC (rev 20077)
+++ core/trunk/core/src/main/java/org/hibernate/hql/classic/QueryTranslatorImpl.java 2010-07-30 03:03:41 UTC (rev 20078)
@@ -983,6 +983,13 @@
throw new UnsupportedOperationException( "Not supported! Use the AST translator...");
}
+ protected ResultTransformer resolveResultTransformer(ResultTransformer resultTransformer) {
+ return HolderInstantiator.resolveClassicResultTransformer(
+ holderConstructor,
+ resultTransformer
+ );
+ }
+
protected Object getResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session)
throws SQLException, HibernateException {
row = toResultRow( row );
Modified: core/trunk/core/src/main/java/org/hibernate/loader/Loader.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/loader/Loader.java 2010-07-29 21:29:48 UTC (rev 20077)
+++ core/trunk/core/src/main/java/org/hibernate/loader/Loader.java 2010-07-30 03:03:41 UTC (rev 20078)
@@ -1008,11 +1008,31 @@
.endLoadingCollections( collectionPersister );
}
+ /**
+ * Determine the actual ResultTransformer that will be used to
+ * transform query results.
+ *
+ * @param resultTransformer the specified result transformer
+ * @return the actual result transformer
+ */
+ protected ResultTransformer resolveResultTransformer(ResultTransformer resultTransformer) {
+ return resultTransformer;
+ }
+
protected List getResultList(List results, ResultTransformer resultTransformer) throws QueryException {
return results;
}
/**
+ * Are rows transformed immediately after being read from the ResultSet?
+ * @param transformer, the specified transformer
+ * @return true, if getResultColumnOrRow() transforms the results; false, otherwise
+ */
+ protected boolean areResultSetRowsTransformedImmediately(ResultTransformer transformer) {
+ return false;
+ }
+
+ /**
* Get the actual object that is returned in the user-visible result list.
* This empty implementation merely returns its first argument. This is
* overridden by some subclasses.
@@ -2272,7 +2292,11 @@
getSQLString(),
queryParameters,
filterKeys,
- session
+ session,
+ ( areResultSetRowsTransformedImmediately( queryParameters.getResultTransformer() ) ?
+ queryParameters.getResultTransformer() :
+ null
+ )
);
if ( querySpaces == null || querySpaces.size() == 0 ) {
@@ -2294,7 +2318,7 @@
if ( result == null ) {
result = doList( session, queryParameters );
- putResultInQueryCache(
+ putResultInQueryCache(
session,
queryParameters,
resultTypes,
@@ -2304,6 +2328,7 @@
);
}
+
return getResultList( result, queryParameters.getResultTransformer() );
}
@@ -2344,6 +2369,22 @@
persistenceContext.setDefaultReadOnly( defaultReadOnlyOrig );
}
+ // If there is a result transformer, but the loader is not expecting the data to be
+ // transformed yet, then the loader expects result elements that are Object[].
+ // The problem is that StandardQueryCache.get(...) does not return a tuple when
+ // resultTypes.length == 1. The following changes the data returned from the cache
+ // to be a tuple.
+ // TODO: this really doesn't belong here, but only Loader has the information
+ // to be able to do this.
+ if ( result != null &&
+ resultTypes.length == 1 &&
+ key.getResultTransformer() == null &&
+ resolveResultTransformer( queryParameters.getResultTransformer() ) != null ) {
+ for ( int i = 0 ; i < result.size() ; i++ ) {
+ result.set( i, new Object[] { result.get( i ) } );
+ }
+ }
+
if ( factory.getStatistics().isStatisticsEnabled() ) {
if ( result == null ) {
factory.getStatisticsImplementor()
@@ -2374,7 +2415,23 @@
result
);
}
- boolean put = queryCache.put( key, resultTypes, result, queryParameters.isNaturalKeyLookup(), session );
+ // If there is a result transformer, but the data has not been transformed yet,
+ // then result elements are Object[]. The problem is that StandardQueryCache.put(...)
+ // does not expect a tuple when resultTypes.length == 1. The following changes the
+ // data being cached to what StandardQueryCache.put(...) expects.
+ // TODO: this really doesn't belong here, but only Loader has the information
+ // to be able to do this.
+ List cachedResult = result;
+ if ( resultTypes.length == 1 &&
+ key.getResultTransformer() == null &&
+ resolveResultTransformer( queryParameters.getResultTransformer() ) != null ) {
+ cachedResult = new ArrayList( result.size() );
+ for ( int i = 0 ; i < result.size() ; i++ ) {
+ cachedResult.add( ( ( Object[] ) result.get( i ) )[ 0 ] );
+ }
+ }
+
+ boolean put = queryCache.put( key, resultTypes, cachedResult, queryParameters.isNaturalKeyLookup(), session );
if ( put && factory.getStatistics().isStatisticsEnabled() ) {
factory.getStatisticsImplementor()
.queryCachePut( getQueryIdentifier(), queryCache.getRegion().getName() );
@@ -2382,7 +2439,6 @@
}
}
-
private void logCachedResultDetails(ResultTransformer resultTransformer, Type[] returnTypes, List result) {
if ( ! log.isTraceEnabled() ) {
return;
Modified: core/trunk/core/src/main/java/org/hibernate/loader/criteria/CriteriaLoader.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/loader/criteria/CriteriaLoader.java 2010-07-29 21:29:48 UTC (rev 20077)
+++ core/trunk/core/src/main/java/org/hibernate/loader/criteria/CriteriaLoader.java 2010-07-30 03:03:41 UTC (rev 20078)
@@ -120,6 +120,16 @@
}
+ protected ResultTransformer resolveResultTransformer(ResultTransformer resultTransformer) {
+ return translator.getRootCriteria().getResultTransformer();
+ }
+
+ protected boolean areResultSetRowsTransformedImmediately( ResultTransformer transformer ) {
+ // comparing to null just in case there is no transformer
+ // (there should always be a result transformer;
+ return resolveResultTransformer( transformer ) != null;
+ }
+
protected Object getResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session)
throws SQLException, HibernateException {
final Object[] result;
@@ -145,8 +155,7 @@
result = row;
aliases = userAliases;
}
- return translator.getRootCriteria().getResultTransformer()
- .transformTuple(result, aliases);
+ return resolveResultTransformer( transformer ).transformTuple(result, aliases);
}
public Set getQuerySpaces() {
@@ -196,9 +205,9 @@
protected boolean isSubselectLoadingEnabled() {
return hasSubselectLoadableCollections();
}
-
+
protected List getResultList(List results, ResultTransformer resultTransformer) {
- return translator.getRootCriteria().getResultTransformer().transformList( results );
+ return resolveResultTransformer( resultTransformer ).transformList( results );
}
}
Modified: core/trunk/core/src/main/java/org/hibernate/loader/custom/CustomLoader.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/loader/custom/CustomLoader.java 2010-07-29 21:29:48 UTC (rev 20077)
+++ core/trunk/core/src/main/java/org/hibernate/loader/custom/CustomLoader.java 2010-07-30 03:03:41 UTC (rev 20078)
@@ -335,6 +335,10 @@
return new HolderInstantiator(resultTransformer, queryReturnAliases);
}
}
+
+ protected ResultTransformer resolveResultTransformer(ResultTransformer resultTransformer) {
+ return HolderInstantiator.resolveResultTransformer( null, resultTransformer );
+ }
protected Object getResultColumnOrRow(
Object[] row,
Modified: core/trunk/core/src/main/java/org/hibernate/loader/hql/QueryLoader.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/loader/hql/QueryLoader.java 2010-07-29 21:29:48 UTC (rev 20077)
+++ core/trunk/core/src/main/java/org/hibernate/loader/hql/QueryLoader.java 2010-07-30 03:03:41 UTC (rev 20078)
@@ -382,6 +382,10 @@
return implicitResultTransformer != null;
}
+ protected ResultTransformer resolveResultTransformer(ResultTransformer resultTransformer) {
+ return HolderInstantiator.resolveResultTransformer( implicitResultTransformer, resultTransformer );
+ }
+
protected Object getResultColumnOrRow(Object[] row, ResultTransformer transformer, ResultSet rs, SessionImplementor session)
throws SQLException, HibernateException {
Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheNormalResultTransformerTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheNormalResultTransformerTest.java 2010-07-29 21:29:48 UTC (rev 20077)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheNormalResultTransformerTest.java 2010-07-30 03:03:41 UTC (rev 20078)
@@ -45,29 +45,4 @@
protected CacheMode getQueryCacheMode() {
return CacheMode.NORMAL;
}
-
- public void testAliasToBeanDtoMultiArgList() {
- reportSkip( "Results from queries using Transformers.aliasToBean cannot be found in the cache due to bug in hashCode",
- "Query using Transformers.aliasToBean with cache"
- );
- }
- public void testAliasToBeanDtoMultiArgListFailureExpected() throws Exception {
- super.testAliasToBeanDtoMultiArgList();
- }
-
- public void testAliasToBeanDtoLiteralArgList() {
- reportSkip( "Results from queries using Transformers.aliasToBean cannot be found in the cache due to bug in hashCode",
- "Query using Transformers.aliasToBean with cache" );
- }
- public void testAliasToBeanDtoLiteralArgListFailureExpected() throws Exception {
- super.testAliasToBeanDtoLiteralArgList();
- }
-
- public void testAliasToBeanDtoWithNullAliasList() {
- reportSkip( "Results from queries using Transformers.aliasToBean cannot be found in the cache due to bug in hashCode",
- "Query using Transformers.aliasToBean with cache" );
- }
- public void testAliasToBeanDtoWithNullAliasListFailureExpected() throws Exception {
- super.testAliasToBeanDtoWithNullAliasList();
- }
}
Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCachePutResultTransformerTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCachePutResultTransformerTest.java 2010-07-29 21:29:48 UTC (rev 20077)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCachePutResultTransformerTest.java 2010-07-30 03:03:41 UTC (rev 20078)
@@ -50,29 +50,4 @@
protected boolean areDynamicNonLazyAssociationsChecked() {
return false;
}
-
- public void testAliasToEntityMapOneProjectionList() {
- reportSkip( "HQL queries using a ResultTransformer are known to fail when caching a row with a single value",
- "HQL queries using a ResultTransformer has row with a single value");
- }
- public void testAliasToEntityMapOneProjectionListFailureExpected() throws Exception {
- super.testAliasToEntityMapOneProjectionList();
- }
-
- public void testAliasToBeanDtoOneArgList() {
- reportSkip( "HQL queries using a ResultTransformer are known to fail when caching a row with a single value",
- "HQL queries using a ResultTransformer has row with a single value");
- }
-
- public void testAliasToBeanDtoOneArgListFailureExpected() throws Exception {
- super.testAliasToBeanDtoOneArgList();
- }
-
- public void testOneSelectNewList() {
- reportSkip( "HQL queries using a ResultTransformer are known to fail when caching a row with a single value",
- "HQL queries using a ResultTransformer has row with a single value");
- }
- public void testOneSelectNewListFailureExpected() throws Exception {
- super.testOneSelectNewList();
- }
}
Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/querycache/QueryCacheTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/querycache/QueryCacheTest.java 2010-07-29 21:29:48 UTC (rev 20077)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/querycache/QueryCacheTest.java 2010-07-30 03:03:41 UTC (rev 20078)
@@ -224,7 +224,7 @@
getSessions().evictQueries();
getSessions().getStatistics().clear();
- final String queryString = "select i.description from Item i where i.name='widget'";
+ final String queryString = "select i.description as desc from Item i where i.name='widget'";
Session s = openSession();
Transaction t = s.beginTransaction();
@@ -239,48 +239,64 @@
QueryStatistics qs = s.getSessionFactory().getStatistics().getQueryStatistics( queryString );
EntityStatistics es = s.getSessionFactory().getStatistics().getEntityStatistics( Item.class.getName() );
+ assertEquals( qs.getCacheHitCount(), 0 );
+ assertEquals( qs.getCacheMissCount(), 1 );
+ assertEquals( qs.getCachePutCount(), 1 );
+
Thread.sleep(200);
s = openSession();
t = s.beginTransaction();
List result = s.createQuery( queryString ).setCacheable(true).list();
assertEquals( result.size(), 1 );
+ assertEquals( i.getDescription(), ( ( String ) result.get( 0 ) ) );
t.commit();
s.close();
assertEquals( qs.getCacheHitCount(), 0 );
+ assertEquals( qs.getCacheMissCount(), 2 );
+ assertEquals( qs.getCachePutCount(), 2 );
s = openSession();
t = s.beginTransaction();
result = s.createQuery( queryString ).setCacheable(true).list();
assertEquals( result.size(), 1 );
+ assertEquals( i.getDescription(), result.get( 0 ) );
t.commit();
s.close();
assertEquals( qs.getCacheHitCount(), 1 );
+ assertEquals( qs.getCacheMissCount(), 2 );
+ assertEquals( qs.getCachePutCount(), 2 );
s = openSession();
t = s.beginTransaction();
result = s.createQuery( queryString ).setCacheable(true).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
assertEquals( result.size(), 1 );
Map m = (Map) result.get(0);
- assertEquals(1, m.size());
+ assertEquals( 1, m.size() );
+ assertEquals( i.getDescription(), m.get( "desc" ) );
t.commit();
s.close();
- assertEquals( "hit count should not go up since we are adding a resulttransformer", qs.getCacheHitCount(), 1 );
-
+ assertEquals( "hit count should go up since data is not transformed until after it is cached", qs.getCacheHitCount(), 2 );
+ assertEquals( qs.getCacheMissCount(), 2 );
+ assertEquals( qs.getCachePutCount(), 2 );
+
s = openSession();
t = s.beginTransaction();
result = s.createQuery( queryString ).setCacheable(true).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
assertEquals( result.size(), 1 );
m = (Map) result.get(0);
assertEquals(1, m.size());
+ assertEquals( i.getDescription(), m.get( "desc" ) );
t.commit();
s.close();
-
- assertEquals( "hit count should go up since we are using the same resulttransformer", qs.getCacheHitCount(), 2 );
-
+
+ assertEquals( "hit count should go up since data is not transformed until after it is cachedr", qs.getCacheHitCount(), 3 );
+ assertEquals( qs.getCacheMissCount(), 2 );
+ assertEquals( qs.getCachePutCount(), 2 );
+
s = openSession();
t = s.beginTransaction();
result = s.createQuery( queryString ).setCacheable(true).list();
@@ -292,8 +308,9 @@
t.commit();
s.close();
- assertEquals( qs.getCacheHitCount(), 3 );
- assertEquals( qs.getCacheMissCount(), 3 );
+ assertEquals( qs.getCacheHitCount(), 4 );
+ assertEquals( qs.getCacheMissCount(), 2 );
+ assertEquals( qs.getCachePutCount(), 2 );
Thread.sleep(200);
@@ -303,15 +320,19 @@
assertEquals( result.size(), 1 );
i = (Item) s.get( Item.class, new Long(i.getId()) );
assertEquals( (String) result.get(0), "A middle-quality widget." );
-
+
+ assertEquals( qs.getCacheHitCount(), 4 );
+ assertEquals( qs.getCacheMissCount(), 3 );
+ assertEquals( qs.getCachePutCount(), 3 );
+
s.delete(i);
t.commit();
s.close();
- assertEquals( qs.getCacheHitCount(), 3 );
- assertEquals( qs.getCacheMissCount(), 4 );
- assertEquals( qs.getCachePutCount(), 4 );
- assertEquals( qs.getExecutionCount(), 4 );
+ assertEquals( qs.getCacheHitCount(), 4 );
+ assertEquals( qs.getCacheMissCount(), 3 );
+ assertEquals( qs.getCachePutCount(), 3 );
+ assertEquals( qs.getExecutionCount(), 3 );
assertEquals( es.getFetchCount(), 0 ); //check that it was being cached
}
13 years, 7 months
Hibernate SVN: r20077 - in core/branches/Branch_3_5: core/src/main/java/org/hibernate/loader and 2 other directories.
by hibernate-commits@lists.jboss.org
Author: gbadner
Date: 2010-07-29 17:29:48 -0400 (Thu, 29 Jul 2010)
New Revision: 20077
Added:
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/AbstractQueryCacheResultTransformerTest.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Address.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Course.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CourseMeeting.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CourseMeetingId.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CriteriaQueryCacheIgnoreResultTransformerTest.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CriteriaQueryCacheNormalResultTransformerTest.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CriteriaQueryCachePutResultTransformerTest.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Enrolment.hbm.xml
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Enrolment.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheIgnoreResultTransformerTest.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheNormalResultTransformerTest.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCachePutResultTransformerTest.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/PersonName.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Student.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/StudentDTO.java
Modified:
core/branches/Branch_3_5/core/src/main/java/org/hibernate/cache/QueryKey.java
core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/Loader.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/criteria/CriteriaQueryTest.java
Log:
HHH-5163 : added logging and test cases for ClassCastException when caching transformed query results
Modified: core/branches/Branch_3_5/core/src/main/java/org/hibernate/cache/QueryKey.java
===================================================================
--- core/branches/Branch_3_5/core/src/main/java/org/hibernate/cache/QueryKey.java 2010-07-29 17:31:57 UTC (rev 20076)
+++ core/branches/Branch_3_5/core/src/main/java/org/hibernate/cache/QueryKey.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -173,6 +173,10 @@
this.hashCode = generateHashCode();
}
+ public ResultTransformer getResultTransformer() {
+ return customTransformer;
+ }
+
/**
* Deserialization hook used to re-init the cached hashcode which is needed for proper clustering support.
*
Modified: core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/Loader.java
===================================================================
--- core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/Loader.java 2010-07-29 17:31:57 UTC (rev 20076)
+++ core/branches/Branch_3_5/core/src/main/java/org/hibernate/loader/Loader.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -2191,6 +2191,13 @@
session
);
+ if ( querySpaces == null || querySpaces.size() == 0 ) {
+ log.trace( "unexpected querySpaces is "+( querySpaces == null ? "null" : "empty" ) );
+ }
+ else {
+ log.trace( "querySpaces is "+querySpaces.toString() );
+ }
+
List result = getResultFromQueryCache(
session,
queryParameters,
@@ -2243,6 +2250,11 @@
}
try {
result = queryCache.get( key, resultTypes, isImmutableNaturalKeyLookup, querySpaces, session );
+ logCachedResultDetails(
+ key.getResultTransformer(),
+ resultTypes,
+ result
+ );
}
finally {
persistenceContext.setDefaultReadOnly( defaultReadOnlyOrig );
@@ -2271,6 +2283,13 @@
final QueryKey key,
final List result) {
if ( session.getCacheMode().isPutEnabled() ) {
+ if ( log.isTraceEnabled() ) {
+ logCachedResultDetails(
+ key.getResultTransformer(),
+ resultTypes,
+ result
+ );
+ }
boolean put = queryCache.put( key, resultTypes, result, queryParameters.isNaturalKeyLookup(), session );
if ( put && factory.getStatistics().isStatisticsEnabled() ) {
factory.getStatisticsImplementor()
@@ -2279,6 +2298,86 @@
}
}
+
+ private void logCachedResultDetails(ResultTransformer resultTransformer, Type[] returnTypes, List result) {
+ if ( ! log.isTraceEnabled() ) {
+ return;
+ }
+ if ( returnTypes == null || returnTypes.length == 0 ) {
+ log.trace( "unexpected returnTypes is "+( returnTypes == null ? "null" : "empty" )+
+ "! transformer="+( resultTransformer == null ? "null" : resultTransformer.getClass().getName() )+
+ " result"+( result == null ? " is null": ".size()=" + result.size() ) );
+ }
+ else {
+ StringBuffer returnTypeNames = new StringBuffer();
+ StringBuffer returnClassNames = new StringBuffer();
+ for ( int i=0; i<returnTypes.length; i++ ) {
+ returnTypeNames.append( returnTypes[ i ].getName() ).append(' ');
+ returnClassNames.append( returnTypes[ i ].getReturnedClass() ).append(' ');
+ }
+ log.trace( "transformer="+( resultTransformer == null ? "null" : resultTransformer.getClass().getName() )+
+ " returnTypes=[ "+returnTypeNames+"]"+" returnClasses=[ "+returnClassNames+"]" );
+ }
+ if ( result != null && result.size() != 0 ) {
+ for ( Iterator it = result.iterator(); it.hasNext(); ) {
+ Object value = it.next();
+ if ( value == null ) {
+ log.trace( "transformer="+( resultTransformer == null ? "null" : resultTransformer.getClass().getName() )+
+ " value is null; returnTypes is "+( returnTypes == null ? "null" : "Type["+returnTypes.length+"]" ) );
+ if ( returnTypes != null && returnTypes.length > 1 ) {
+ log.trace( "unexpected result value! "+
+ "transformer="+( resultTransformer == null ? "null" : resultTransformer.getClass().getName() )+
+ "value is null; should be Object["+returnTypes.length+"]!" );
+ }
+ }
+ else {
+ if ( returnTypes == null || returnTypes.length == 0 ) {
+ log.trace( "unexpected result value! "+
+ "transformer="+( resultTransformer == null ? "null" : resultTransformer.getClass().getName() )+
+ "value is non-null; returnTypes is "+( returnTypes == null ? "null" : "empty" ) );
+ }
+ else if ( Object[].class.isInstance( value ) ) {
+ Object[] tuple = ( Object[] ) value;
+ log.trace( "transformer="+( resultTransformer == null ? "null" : resultTransformer.getClass().getName() )+
+ " value is Object["+tuple.length+
+ "]; returnTypes is Type["+returnTypes.length+"]" );
+ if ( tuple.length != returnTypes.length ) {
+ log.trace( "unexpected tuple length! transformer="+
+ ( resultTransformer == null ? "null" : resultTransformer.getClass().getName() )+
+ " expected="+returnTypes.length+
+ " got="+tuple.length );
+ }
+ else {
+ for ( int j = 0; j < tuple.length; j++ ) {
+ if ( tuple[ j ] != null && ! returnTypes[ j ].getReturnedClass().isInstance( tuple[ j ] ) ) {
+ log.trace( "unexpected tuple value type! transformer="+
+ ( resultTransformer == null ? "null" : resultTransformer.getClass().getName() )+
+ " expected="+returnTypes[ j ].getReturnedClass().getName()+
+ " got="+tuple[ j ].getClass().getName() );
+ }
+ }
+ }
+ }
+ else {
+ if ( returnTypes.length != 1 ) {
+ log.trace( "unexpected number of result columns! should be Object["+returnTypes.length+"]! transformer="+
+ ( resultTransformer == null ? "null" : resultTransformer.getClass().getName() )+
+ " value type="+value.getClass().getName()+
+ " returnTypes is Type["+returnTypes.length+"]" );
+ }
+ else if ( ! returnTypes[ 0 ].getReturnedClass().isInstance( value ) ) {
+ log.trace( "unexpected value type! transformer="+
+ ( resultTransformer == null ? "null" : resultTransformer.getClass().getName() )+
+ " expected="+returnTypes[ 0 ].getReturnedClass().getName()+
+ " got="+ value.getClass().getName() );
+ }
+ }
+ }
+ }
+ }
+ }
+
+
/**
* Actually execute a query, ignoring the query cache
*/
Modified: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/criteria/CriteriaQueryTest.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/criteria/CriteriaQueryTest.java 2010-07-29 17:31:57 UTC (rev 20076)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/criteria/CriteriaQueryTest.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -741,6 +741,18 @@
}
}
+ //this should fail on Oracle due to the alias being used in the where clause
+ resultList = s.createCriteria(Student.class)
+ .add(Restrictions.eq("name", "Gavin King"))
+ .setProjection( Projections.projectionList()
+ .add( Projections.id().as( "studentNumber" ))
+ .add( Property.forName( "name" ), "name" )
+ .add( Property.forName( "cityState" ), "cityState" )
+ .add( Property.forName("preferredCourse"), "preferredCourse" )
+ )
+ .list();
+ assertEquals( 1, resultList.size() );
+
Object[] aResult = ( Object[] ) s.createCriteria(Student.class)
.add( Restrictions.idEq( new Long( 667 ) ) )
.setProjection( Projections.projectionList()
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/AbstractQueryCacheResultTransformerTest.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/AbstractQueryCacheResultTransformerTest.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/AbstractQueryCacheResultTransformerTest.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,2170 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ *
+ */
+package org.hibernate.test.querycache;
+
+import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.hibernate.CacheMode;
+import org.hibernate.Criteria;
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+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.criterion.Order;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Property;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.impl.SessionFactoryImpl;
+import org.hibernate.junit.functional.FunctionalTestCase;
+import org.hibernate.proxy.HibernateProxy;
+import org.hibernate.transform.AliasToBeanConstructorResultTransformer;
+import org.hibernate.transform.Transformers;
+import org.hibernate.type.Type;
+import org.hibernate.util.ReflectHelper;
+
+/**
+ * @author Gail Badner
+ */
+public abstract class AbstractQueryCacheResultTransformerTest extends FunctionalTestCase {
+
+ private Student yogiExpected;
+ private Student shermanExpected;
+ private CourseMeeting courseMeetingExpected1;
+ private CourseMeeting courseMeetingExpected2;
+ private Course courseExpected;
+ private Enrolment yogiEnrolmentExpected;
+ private Enrolment shermanEnrolmentExpected;
+
+ public AbstractQueryCacheResultTransformerTest(String str) {
+ super( str );
+ }
+
+ public String[] getMappings() {
+ return new String[] { "querycache/Enrolment.hbm.xml" };
+ }
+
+ public void configure(Configuration cfg) {
+ super.configure( cfg );
+ cfg.setProperty( Environment.USE_QUERY_CACHE, "true" );
+ cfg.setProperty( Environment.CACHE_REGION_PREFIX, "foo" );
+ cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "true" );
+ cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+ }
+
+ protected abstract class CriteriaExecutor extends QueryExecutor {
+ protected abstract Criteria getCriteria(Session s) throws Exception;
+ protected Object getResults(Session s, boolean isSingleResult) throws Exception {
+ Criteria criteria = getCriteria( s ).setCacheable( getQueryCacheMode() != CacheMode.IGNORE ).setCacheMode( getQueryCacheMode() );
+ return ( isSingleResult ? criteria.uniqueResult() : criteria.list() );
+ }
+ }
+
+ protected abstract class HqlExecutor extends QueryExecutor {
+ protected abstract Query getQuery(Session s);
+ protected Object getResults(Session s, boolean isSingleResult) {
+ Query query = getQuery( s ).setCacheable( getQueryCacheMode() != CacheMode.IGNORE ).setCacheMode( getQueryCacheMode() );
+ return ( isSingleResult ? query.uniqueResult() : query.list() );
+ }
+ }
+
+ protected abstract class QueryExecutor {
+ public Object execute(boolean isSingleResult) throws Exception{
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+ Object result = getResults( s, isSingleResult );
+ t.commit();
+ s.close();
+ return result;
+ }
+ protected abstract Object getResults(Session s, boolean isSingleResult) throws Exception;
+ }
+
+ protected interface ResultChecker {
+ void check(Object results);
+ }
+
+ protected abstract CacheMode getQueryCacheMode();
+
+ protected boolean areDynamicNonLazyAssociationsChecked() {
+ return true;
+ }
+
+ protected void createData() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ courseExpected = new Course();
+ courseExpected.setCourseCode( "HIB" );
+ courseExpected.setDescription( "Hibernate Training" );
+ courseMeetingExpected1 = new CourseMeeting( courseExpected, "Monday", 1, "1313 Mockingbird Lane" );
+ courseMeetingExpected2 = new CourseMeeting( courseExpected, "Tuesday", 2, "1313 Mockingbird Lane" );
+ courseExpected.getCourseMeetings().add( courseMeetingExpected1 );
+ courseExpected.getCourseMeetings().add( courseMeetingExpected2 );
+ s.save( courseExpected );
+
+ yogiExpected = new Student();
+ yogiExpected.setName( new PersonName( "Yogi", "The", "Bear" ) );
+ yogiExpected.setStudentNumber( 111 );
+ yogiExpected.setPreferredCourse( courseExpected );
+ List yogiSecretCodes = new ArrayList();
+ yogiSecretCodes.add( Integer.valueOf( 0 ) );
+ yogiExpected.setSecretCodes( yogiSecretCodes );
+ s.save( yogiExpected );
+
+ Address address1 = new Address( yogiExpected, "home", "1 Main Street", "Podunk", "WA", "98000", "USA" );
+ Address address2 = new Address( yogiExpected, "work", "2 Main Street", "NotPodunk", "WA", "98001", "USA" );
+ yogiExpected.getAddresses().put( address1.getAddressType(), address1 );
+ yogiExpected.getAddresses().put( address2.getAddressType(), address2 );
+ s.save( address1 );
+ s.save( address2 );
+
+ shermanExpected = new Student();
+ shermanExpected.setName( new PersonName( "Sherman", null, "Grote" ) );
+ shermanExpected.setStudentNumber( 999 );
+ List shermanSecretCodes = new ArrayList();
+ shermanSecretCodes.add( Integer.valueOf( 1 ) );
+ shermanSecretCodes.add( Integer.valueOf( 2 ) );
+ shermanExpected.setSecretCodes( shermanSecretCodes );
+ s.save( shermanExpected );
+
+ shermanEnrolmentExpected = new Enrolment();
+ shermanEnrolmentExpected.setCourse( courseExpected );
+ shermanEnrolmentExpected.setCourseCode( courseExpected.getCourseCode() );
+ shermanEnrolmentExpected.setSemester( ( short ) 1 );
+ shermanEnrolmentExpected.setYear( ( short ) 1999 );
+ shermanEnrolmentExpected.setStudent( shermanExpected );
+ shermanEnrolmentExpected.setStudentNumber( shermanExpected.getStudentNumber() );
+ shermanExpected.getEnrolments().add( shermanEnrolmentExpected );
+ s.save( shermanEnrolmentExpected );
+
+ yogiEnrolmentExpected = new Enrolment();
+ yogiEnrolmentExpected.setCourse( courseExpected );
+ yogiEnrolmentExpected.setCourseCode( courseExpected.getCourseCode() );
+ yogiEnrolmentExpected.setSemester( ( short ) 3 );
+ yogiEnrolmentExpected.setYear( ( short ) 1998 );
+ yogiEnrolmentExpected.setStudent( yogiExpected );
+ yogiEnrolmentExpected.setStudentNumber( yogiExpected.getStudentNumber() );
+ yogiExpected.getEnrolments().add( yogiEnrolmentExpected );
+ s.save( yogiEnrolmentExpected );
+
+ t.commit();
+ s.close();
+ }
+
+ protected void deleteData() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+/*
+ List students = s.createQuery( "from Student" ).list();
+ for ( Iterator it = students.iterator(); it.hasNext(); ) {
+ s.delete( it.next() );
+ }
+ s.createQuery( "delete from Enrolment" ).executeUpdate();
+ s.createQuery( "delete from CourseMeeting" ).executeUpdate();
+ s.createQuery( "delete from Course" ).executeUpdate();
+*/
+ s.delete( yogiExpected );
+ s.delete( shermanExpected );
+ s.delete( yogiEnrolmentExpected );
+ s.delete( shermanEnrolmentExpected );
+ s.delete( courseMeetingExpected1 );
+ s.delete( courseMeetingExpected2 );
+ s.delete( courseExpected );
+ t.commit();
+ s.close();
+ }
+
+ public void testEntityWithNonLazyOneToManyUnique() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Course.class );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Course" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ assertTrue( results instanceof Course );
+ assertEquals( courseExpected, results );
+ assertTrue( Hibernate.isInitialized( ( ( Course ) courseExpected ).getCourseMeetings() ) );
+ assertEquals( courseExpected.getCourseMeetings(), ( ( Course ) courseExpected ).getCourseMeetings() );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, true );
+ }
+
+ public void testEntityWithNonLazyManyToOneList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( CourseMeeting.class )
+ .addOrder( Order.asc( "id.day") );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ protected Query getQuery(Session s) {
+ return s.createQuery( "from CourseMeeting order by id.day" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ assertEquals( courseMeetingExpected1, resultList.get( 0 ) );
+ assertEquals( courseMeetingExpected2, resultList.get( 1 ) );
+ assertTrue( Hibernate.isInitialized( ( ( CourseMeeting ) resultList.get( 0 ) ).getCourse() ) );
+ assertTrue( Hibernate.isInitialized( ( ( CourseMeeting ) resultList.get( 1 ) ).getCourse() ) );
+ assertEquals( courseExpected, ( ( CourseMeeting ) resultList.get( 0 ) ).getCourse() );
+ assertEquals( courseExpected, ( ( CourseMeeting ) resultList.get( 1 ) ).getCourse() );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testEntityWithLazyAssnUnique() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .add( Restrictions.eq( "studentNumber", shermanExpected.getStudentNumber() ) );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Student s where s.studentNumber = :studentNumber" )
+ .setParameter( "studentNumber", shermanExpected.getStudentNumber() );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ assertTrue( results instanceof Student );
+ assertEquals( shermanExpected, results );
+ assertFalse( Hibernate.isInitialized( ( ( Student ) results ).getEnrolments() ) );
+ assertNull( ( ( Student ) results ).getPreferredCourse() );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, true );
+ }
+
+ // should use RootEntityTransformer by default
+ public void testEntityWithLazyAssnList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class )
+ .addOrder( Order.asc( "studentNumber") );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Student order by studentNumber" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ assertEquals( yogiExpected, resultList.get( 0 ) );
+ assertEquals( shermanExpected, resultList.get( 1 ) );
+ assertFalse( Hibernate.isInitialized( ( ( Student ) resultList.get( 0 ) ).getEnrolments() ) );
+ assertFalse( Hibernate.isInitialized( ( ( Student ) resultList.get( 0 ) ).getPreferredCourse() ) );
+ assertFalse( Hibernate.isInitialized( ( ( Student ) resultList.get( 1 ) ).getEnrolments() ) );
+ assertNull( ( ( Student ) resultList.get( 1 ) ).getPreferredCourse() );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testEntityWithJoinFetchedLazyOneToManySingleElementList() throws Exception {
+ // unaliased
+ CriteriaExecutor criteriaExecutorUnaliased = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .setFetchMode( "enrolments", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ HqlExecutor hqlExecutorUnaliased = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Student s left join fetch s.enrolments order by s.studentNumber" );
+ }
+ };
+
+ // aliased
+ CriteriaExecutor criteriaExecutorAliased1 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.enrolments", "e", Criteria.LEFT_JOIN )
+ .setFetchMode( "enrolments", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased2 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.enrolments", "e", Criteria.LEFT_JOIN )
+ .setFetchMode( "e", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased3 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createCriteria( "s.enrolments", "e", Criteria.LEFT_JOIN )
+ .setFetchMode( "enrolments", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased4 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createCriteria( "s.enrolments", "e", Criteria.LEFT_JOIN )
+ .setFetchMode( "e", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ HqlExecutor hqlExecutorAliased = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Student s left join fetch s.enrolments e order by s.studentNumber" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ assertEquals( yogiExpected, resultList.get( 0 ) );
+ assertEquals( shermanExpected, resultList.get( 1 ) );
+ if ( areDynamicNonLazyAssociationsChecked() ) {
+ assertTrue( Hibernate.isInitialized( ( ( Student ) resultList.get( 0 ) ).getEnrolments() ) );
+ assertEquals( yogiExpected.getEnrolments(), ( ( Student ) resultList.get( 0 ) ).getEnrolments() );
+ assertTrue( Hibernate.isInitialized( ( ( Student ) resultList.get( 1 ) ).getEnrolments() ) );
+ assertEquals( shermanExpected.getEnrolments(), ( ( Student ) resultList.get( 1 ) ).getEnrolments() );
+ }
+ }
+ };
+
+ runTest( hqlExecutorUnaliased, criteriaExecutorUnaliased, checker, false);
+ runTest( hqlExecutorAliased, criteriaExecutorAliased1, checker, false);
+ runTest( null, criteriaExecutorAliased2, checker, false);
+ runTest( null, criteriaExecutorAliased3, checker, false);
+ runTest( null, criteriaExecutorAliased4, checker, false);
+
+ }
+
+ public void testEntityWithJoinFetchedLazyOneToManyMultiAndNullElementList() throws Exception {
+ //unaliased
+ CriteriaExecutor criteriaExecutorUnaliased = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .setFetchMode( "addresses", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ HqlExecutor hqlExecutorUnaliased = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Student s left join fetch s.addresses order by s.studentNumber" );
+ }
+ };
+
+ //aliased
+ CriteriaExecutor criteriaExecutorAliased1 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.addresses", "a", Criteria.LEFT_JOIN )
+ .setFetchMode( "addresses", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased2 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.addresses", "a", Criteria.LEFT_JOIN )
+ .setFetchMode( "a", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased3 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createCriteria( "s.addresses", "a", Criteria.LEFT_JOIN )
+ .setFetchMode( "addresses", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased4 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createCriteria( "s.addresses", "a", Criteria.LEFT_JOIN )
+ .setFetchMode( "a", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ HqlExecutor hqlExecutorAliased = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Student s left join fetch s.addresses a order by s.studentNumber" );
+ }
+ };
+
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 3, resultList.size() );
+ assertEquals( yogiExpected, resultList.get( 0 ) );
+ assertSame( resultList.get( 0 ), resultList.get( 1 ) );
+ assertEquals( shermanExpected, resultList.get( 2 ) );
+ if ( areDynamicNonLazyAssociationsChecked() ) {
+ assertTrue( Hibernate.isInitialized( ( ( Student ) resultList.get( 0 ) ).getAddresses() ) );
+ assertEquals( yogiExpected.getAddresses(), ( ( Student ) resultList.get( 0 ) ).getAddresses() );
+ assertTrue( ( ( Student ) resultList.get( 2 ) ).getAddresses().isEmpty() );
+ }
+ }
+ };
+ runTest( hqlExecutorUnaliased, criteriaExecutorUnaliased, checker, false );
+ runTest( hqlExecutorAliased, criteriaExecutorAliased1, checker, false );
+ runTest( null, criteriaExecutorAliased2, checker, false );
+ runTest( null, criteriaExecutorAliased3, checker, false );
+ runTest( null, criteriaExecutorAliased4, checker, false );
+ }
+
+ public void testEntityWithJoinFetchedLazyManyToOneList() throws Exception {
+ // unaliased
+ CriteriaExecutor criteriaExecutorUnaliased = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .setFetchMode( "preferredCourse", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ HqlExecutor hqlExecutorUnaliased = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Student s left join fetch s.preferredCourse order by s.studentNumber" );
+ }
+ };
+
+ // aliased
+ CriteriaExecutor criteriaExecutorAliased1 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.preferredCourse", "pCourse", Criteria.LEFT_JOIN )
+ .setFetchMode( "preferredCourse", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased2 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.preferredCourse", "pCourse", Criteria.LEFT_JOIN )
+ .setFetchMode( "pCourse", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased3 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createCriteria( "s.preferredCourse", "pCourse", Criteria.LEFT_JOIN )
+ .setFetchMode( "preferredCourse", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased4 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createCriteria( "s.preferredCourse", "pCourse", Criteria.LEFT_JOIN )
+ .setFetchMode( "pCourse", FetchMode.JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ HqlExecutor hqlExecutorAliased = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Student s left join fetch s.preferredCourse pCourse order by s.studentNumber" );
+ }
+ };
+
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ assertEquals( yogiExpected, resultList.get( 0 ) );
+ assertEquals( shermanExpected, resultList.get( 1 ) );
+ assertEquals( yogiExpected.getPreferredCourse().getCourseCode(),
+ ( ( Student ) resultList.get( 0 ) ).getPreferredCourse().getCourseCode() );
+ assertNull( ( ( Student ) resultList.get( 1 ) ).getPreferredCourse() );
+ }
+ };
+ runTest( hqlExecutorUnaliased, criteriaExecutorUnaliased, checker, false );
+ runTest( hqlExecutorAliased, criteriaExecutorAliased1, checker, false );
+ runTest( null, criteriaExecutorAliased2, checker, false );
+ runTest( null, criteriaExecutorAliased3, checker, false );
+ runTest( null, criteriaExecutorAliased4, checker, false );
+ }
+
+ public void testEntityWithJoinedLazyOneToManySingleElementListCriteria() throws Exception {
+ CriteriaExecutor criteriaExecutorUnaliased = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createCriteria( "s.enrolments", Criteria.LEFT_JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased1 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createCriteria( "s.enrolments", "e", Criteria.LEFT_JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased2 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.enrolments", "e", Criteria.LEFT_JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ assertEquals( yogiExpected, resultList.get( 0 ) );
+ assertEquals( shermanExpected, resultList.get( 1 ) );
+ if ( areDynamicNonLazyAssociationsChecked() ) {
+ assertTrue( Hibernate.isInitialized( ( ( Student ) resultList.get( 0 ) ).getEnrolments() ) );
+ assertEquals( yogiExpected.getEnrolments(), ( ( Student ) resultList.get( 0 ) ).getEnrolments() );
+ assertTrue( Hibernate.isInitialized( ( ( Student ) resultList.get( 1 ) ).getEnrolments() ) );
+ assertEquals( shermanExpected.getEnrolments(), ( ( Student ) resultList.get( 1 ) ).getEnrolments() );
+ }
+ }
+ };
+ runTest( null, criteriaExecutorUnaliased, checker, false );
+ runTest( null, criteriaExecutorAliased1, checker, false );
+ runTest( null, criteriaExecutorAliased2, checker, false );
+ }
+
+ public void testEntityWithJoinedLazyOneToManyMultiAndNullListCriteria() throws Exception {
+ CriteriaExecutor criteriaExecutorUnaliased = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createCriteria( "s.addresses", Criteria.LEFT_JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased1 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createCriteria( "s.addresses", "a", Criteria.LEFT_JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased2 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.addresses", "a", Criteria.LEFT_JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 3, resultList.size() );
+ assertEquals( yogiExpected, resultList.get( 0 ) );
+ assertSame( resultList.get( 0 ), resultList.get( 1 ) );
+ assertEquals( shermanExpected, resultList.get( 2 ) );
+ if ( areDynamicNonLazyAssociationsChecked() ) {
+ assertTrue( Hibernate.isInitialized( ( ( Student ) resultList.get( 0 ) ).getAddresses() ) );
+ assertEquals( yogiExpected.getAddresses(), ( ( Student ) resultList.get( 0 ) ).getAddresses() );
+ assertTrue( ( ( Student ) resultList.get( 2 ) ).getAddresses().isEmpty() );
+ }
+ }
+ };
+ runTest( null, criteriaExecutorUnaliased, checker, false );
+ runTest( null, criteriaExecutorAliased1, checker, false );
+ runTest( null, criteriaExecutorAliased2, checker, false );
+ }
+
+ public void testEntityWithJoinedLazyManyToOneListCriteria() throws Exception {
+ CriteriaExecutor criteriaExecutorUnaliased = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createCriteria( "s.preferredCourse", Criteria.LEFT_JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased1 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createCriteria( "s.preferredCourse", "p", Criteria.LEFT_JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ CriteriaExecutor criteriaExecutorAliased2 = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.preferredCourse", "p", Criteria.LEFT_JOIN )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ assertEquals( yogiExpected, resultList.get( 0 ) );
+ assertEquals( shermanExpected, resultList.get( 1 ) );
+ assertEquals( yogiExpected.getPreferredCourse().getCourseCode(),
+ ( ( Student ) resultList.get( 0 ) ).getPreferredCourse().getCourseCode() );
+ assertNull( ( ( Student ) resultList.get( 1 ) ).getPreferredCourse() );
+ }
+ };
+ runTest( null, criteriaExecutorUnaliased, checker, false );
+ runTest( null, criteriaExecutorAliased1, checker, false );
+ runTest( null, criteriaExecutorAliased2, checker, false );
+ }
+
+ public void testEntityWithJoinedLazyOneToManySingleElementListHql() throws Exception {
+ HqlExecutor hqlExecutorUnaliased = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Student s left join s.enrolments order by s.studentNumber" );
+ }
+ };
+ HqlExecutor hqlExecutorAliased = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Student s left join s.enrolments e order by s.studentNumber" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ assertTrue( resultList.get( 0 ) instanceof Object[] );
+ Object[] yogiObjects = ( Object[] ) resultList.get( 0 );
+ assertEquals( yogiExpected, yogiObjects[ 0 ] );
+ assertEquals( yogiEnrolmentExpected, yogiObjects[ 1 ] );
+ assertTrue( resultList.get( 0 ) instanceof Object[] );
+ Object[] shermanObjects = ( Object[] ) resultList.get( 1 );
+ assertEquals( shermanExpected, shermanObjects[ 0 ] );
+ assertEquals( shermanEnrolmentExpected, shermanObjects[ 1 ] );
+ }
+ };
+ runTest( hqlExecutorUnaliased, null, checker, false );
+ runTest( hqlExecutorAliased, null, checker, false );
+ }
+
+ public void testEntityWithJoinedLazyOneToManyMultiAndNullListHql() throws Exception {
+ HqlExecutor hqlExecutorUnaliased = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Student s left join s.addresses order by s.studentNumber" );
+ }
+ };
+ HqlExecutor hqlExecutorAliased = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Student s left join s.addresses a order by s.studentNumber" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 3, resultList.size() );
+ assertTrue( resultList.get( 0 ) instanceof Object[] );
+ Object[] yogiObjects1 = ( Object[] ) resultList.get( 0 );
+ assertEquals( yogiExpected, yogiObjects1[ 0 ] );
+ Address address1 = ( Address ) yogiObjects1[ 1 ];
+ assertEquals( yogiExpected.getAddresses().get( address1.getAddressType() ), address1 );
+ Object[] yogiObjects2 = ( Object[] ) resultList.get( 1 );
+ assertSame( yogiObjects1[ 0 ], yogiObjects2[ 0 ] );
+ Address address2 = ( Address ) yogiObjects2[ 1 ];
+ assertEquals( yogiExpected.getAddresses().get( address2.getAddressType() ), address2 );
+ assertFalse( address1.getAddressType().equals( address2.getAddressType() ) );
+ Object[] shermanObjects = ( Object[] ) resultList.get( 2 );
+ assertEquals( shermanExpected, shermanObjects[ 0 ] );
+ assertNull( shermanObjects[ 1 ] );
+ }
+ };
+ runTest( hqlExecutorUnaliased, null, checker, false );
+ runTest( hqlExecutorAliased, null, checker, false );
+ }
+
+ public void testEntityWithJoinedLazyManyToOneListHql() throws Exception {
+ HqlExecutor hqlExecutorUnaliased = new HqlExecutor() {
+ protected Query getQuery(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createQuery( "from Student s left join s.preferredCourse order by s.studentNumber" );
+ }
+ };
+ HqlExecutor hqlExecutorAliased = new HqlExecutor() {
+ protected Query getQuery(Session s) {
+ // should use RootEntityTransformer by default
+ return s.createQuery( "from Student s left join s.preferredCourse p order by s.studentNumber" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ Object[] yogiObjects = ( Object[] ) resultList.get( 0 );
+ assertEquals( yogiExpected, yogiObjects[ 0 ] );
+ assertEquals( yogiExpected.getPreferredCourse(), yogiObjects[ 1 ] );
+ Object[] shermanObjects = ( Object[] ) resultList.get( 1 );
+ assertEquals( shermanExpected, shermanObjects[ 0 ] );
+ assertNull( shermanObjects[ 1 ] );
+ }
+ };
+ runTest( hqlExecutorUnaliased, null, checker, false );
+ runTest( hqlExecutorAliased, null, checker, false );
+ }
+
+ public void testAliasToEntityMapNoProjectionList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.enrolments", "e", Criteria.LEFT_JOIN )
+ .createAlias( "e.course", "c", Criteria.LEFT_JOIN )
+ .setResultTransformer( Criteria.ALIAS_TO_ENTITY_MAP )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Student s left join s.enrolments e left join e.course c order by s.studentNumber" )
+ .setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ Map yogiMap = ( Map ) resultList.get( 0 );
+ assertEquals( 3, yogiMap.size() );
+ Map shermanMap = ( Map ) resultList.get( 1 );
+ assertEquals( 3, shermanMap.size() );
+ assertEquals( yogiExpected, yogiMap.get( "s" ) );
+ assertEquals( yogiEnrolmentExpected, yogiMap.get( "e" ) );
+ assertEquals( courseExpected, yogiMap.get( "c" ) );
+ assertEquals( shermanExpected, shermanMap.get( "s" ) );
+ assertEquals( shermanEnrolmentExpected, shermanMap.get( "e" ) );
+ assertEquals( courseExpected, shermanMap.get( "c" ) );
+ assertSame( ( ( Map ) resultList.get( 0 ) ).get( "c" ), shermanMap.get( "c" ) );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testAliasToEntityMapNoProjectionMultiAndNullList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.preferredCourse", "p", Criteria.LEFT_JOIN )
+ .createAlias( "s.addresses", "a", Criteria.LEFT_JOIN )
+ .setResultTransformer( Criteria.ALIAS_TO_ENTITY_MAP )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "from Student s left join s.preferredCourse p left join s.addresses a order by s.studentNumber" )
+ .setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 3, resultList.size() );
+ Map yogiMap1 = ( Map ) resultList.get( 0 );
+ assertEquals( 3, yogiMap1.size() );
+ Map yogiMap2 = ( Map ) resultList.get( 1 );
+ assertEquals( 3, yogiMap2.size() );
+ Map shermanMap = ( Map ) resultList.get( 2 );
+ assertEquals( 3, shermanMap.size() );
+ assertEquals( yogiExpected, yogiMap1.get( "s" ) );
+ assertEquals( courseExpected, yogiMap1.get( "p" ) );
+ Address yogiAddress1 = ( Address ) yogiMap1.get( "a" );
+ assertEquals( yogiExpected.getAddresses().get( yogiAddress1.getAddressType() ),
+ yogiMap1.get( "a" ));
+ assertEquals( yogiExpected, yogiMap2.get( "s" ) );
+ assertEquals( courseExpected, yogiMap2.get( "p" ) );
+ Address yogiAddress2 = ( Address ) yogiMap2.get( "a" );
+ assertEquals( yogiExpected.getAddresses().get( yogiAddress2.getAddressType() ),
+ yogiMap2.get( "a" ));
+ assertSame( yogiMap1.get( "s" ), yogiMap2.get( "s" ) );
+ assertSame( yogiMap1.get( "p" ), yogiMap2.get( "p" ) );
+ assertFalse( yogiAddress1.getAddressType().equals( yogiAddress2.getAddressType() ) );
+ assertEquals( shermanExpected, shermanMap.get( "s" ) );
+ assertEquals( shermanExpected.getPreferredCourse(), shermanMap.get( "p" ) );
+ assertNull( shermanMap.get( "a") );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testAliasToEntityMapOneProjectionList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Enrolment.class, "e" )
+ .setProjection( Projections.property( "e.student" ).as( "student" ) )
+ .addOrder( Order.asc( "e.studentNumber") )
+ .setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select e.student as student from Enrolment e order by e.studentNumber" )
+ .setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ Map yogiMap = ( Map ) resultList.get( 0 );
+ Map shermanMap = ( Map ) resultList.get( 1 );
+ assertEquals( 1, yogiMap.size() );
+ //assertTrue( yogiMap[ 0 ] instanceof HibernateProxy );
+ assertTrue( yogiMap.get( "student" ) instanceof Student );
+ if( Hibernate.isInitialized( yogiMap.get( "student" ) ) ) {
+ assertEquals( yogiExpected, yogiMap.get( "student" ) );
+ }
+ else {
+ assertEquals( yogiExpected.getStudentNumber(), ( ( Student ) yogiMap.get( "student" ) ).getStudentNumber() );
+ }
+ assertEquals( 1, shermanMap.size() );
+ //assertTrue( shermanMap[ 0 ] instanceof HibernateProxy );
+ assertTrue( shermanMap.get( "student" ) instanceof Student );
+ if( Hibernate.isInitialized( shermanMap.get( "student" ) ) ) {
+ assertEquals( shermanExpected, shermanMap.get( "student" ) );
+ }
+ else {
+ assertEquals( shermanExpected.getStudentNumber(), ( ( Student ) shermanMap.get( "student" ) ).getStudentNumber() );
+ }
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false);
+ }
+
+ public void testAliasToEntityMapMultiProjectionList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Enrolment.class, "e" )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "e.student" ), "student" )
+ .add( Property.forName( "e.semester" ), "semester" )
+ .add( Property.forName( "e.year" ), "year" )
+ .add( Property.forName( "e.course" ), "course" )
+ )
+ .addOrder( Order.asc( "studentNumber") )
+ .setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select e.student as student, e.semester as semester, e.year as year, e.course as course from Enrolment e order by e.studentNumber" )
+ .setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ Map yogiMap = ( Map ) resultList.get( 0 );
+ Map shermanMap = ( Map ) resultList.get( 1 );
+ assertEquals( 4, yogiMap.size() );
+ //assertTrue( yogiMap[ 0 ] instanceof HibernateProxy );
+ assertTrue( yogiMap.get( "student" ) instanceof Student );
+ if( Hibernate.isInitialized( yogiMap.get( "student" ) ) ) {
+ assertEquals( yogiExpected, yogiMap.get( "student" ) );
+ }
+ else {
+ assertEquals( yogiExpected.getStudentNumber(), ( ( Student ) yogiMap.get( "student" ) ).getStudentNumber() );
+ }
+ assertEquals( yogiEnrolmentExpected.getSemester(), yogiMap.get( "semester" ) );
+ assertEquals( yogiEnrolmentExpected.getYear(), yogiMap.get( "year" ) );
+ assertEquals( courseExpected, yogiMap.get( "course" ) );
+ assertEquals( 4, shermanMap.size() );
+ //assertTrue( shermanMap[ 0 ] instanceof HibernateProxy );
+ assertTrue( shermanMap.get( "student" ) instanceof Student );
+ if( Hibernate.isInitialized( shermanMap.get( "student" ) ) ) {
+ assertEquals( shermanExpected, shermanMap.get( "student" ) );
+ }
+ else {
+ assertEquals( shermanExpected.getStudentNumber(), ( ( Student ) shermanMap.get( "student" ) ).getStudentNumber() );
+ }
+ assertEquals( shermanEnrolmentExpected.getSemester(), shermanMap.get( "semester" ) );
+ assertEquals( shermanEnrolmentExpected.getYear(), shermanMap.get( "year" ) );
+ assertEquals( courseExpected, shermanMap.get( "course" ) );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testAliasToEntityMapMultiProjectionWithNullAliasList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Enrolment.class, "e" )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "e.student" ), "student" )
+ .add( Property.forName( "e.semester" ) )
+ .add( Property.forName( "e.year" ) )
+ .add( Property.forName( "e.course" ), "course" )
+ )
+ .addOrder( Order.asc( "e.studentNumber") )
+ .setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select e.student as student, e.semester, e.year, e.course as course from Enrolment e order by e.studentNumber" )
+ .setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ Map yogiMap = ( Map ) resultList.get( 0 );
+ Map shermanMap = ( Map ) resultList.get( 1 );
+ //assertEquals( 2, yogiMap.size() );
+ //assertTrue( yogiMap[ 0 ] instanceof HibernateProxy );
+ assertTrue( yogiMap.get( "student" ) instanceof Student );
+ if( Hibernate.isInitialized( yogiMap.get( "student" ) ) ) {
+ assertEquals( yogiExpected, yogiMap.get( "student" ) );
+ }
+ else {
+ assertEquals( yogiExpected.getStudentNumber(), ( ( Student ) yogiMap.get( "student" ) ).getStudentNumber() );
+ }
+ assertNull( yogiMap.get( "semester" ) );
+ assertNull( yogiMap.get( "year" ) );
+ assertEquals( courseExpected, yogiMap.get( "course" ) );
+ //assertEquals( 2, shermanMap.size() );
+ //assertTrue( shermanMap[ 0 ] instanceof HibernateProxy );
+ assertTrue( shermanMap.get( "student" ) instanceof Student );
+ if( Hibernate.isInitialized( shermanMap.get( "student" ) ) ) {
+ assertEquals( shermanExpected, shermanMap.get( "student" ) );
+ }
+ else {
+ assertEquals( shermanExpected.getStudentNumber(), ( ( Student ) shermanMap.get( "student" ) ).getStudentNumber() );
+ }
+ assertNull( shermanMap.get( "semester" ) );
+ assertNull( shermanMap.get( "year" ) );
+ assertEquals( courseExpected, shermanMap.get( "course" ) );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testAliasToEntityMapMultiAggregatedPropProjectionSingleResult() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Enrolment.class )
+ .setProjection(
+ Projections.projectionList()
+ .add( Projections.min( "studentNumber" ).as( "minStudentNumber" ) )
+ .add( Projections.max( "studentNumber" ).as( "maxStudentNumber" ) )
+ )
+ .setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery(
+ "select min( e.studentNumber ) as minStudentNumber, max( e.studentNumber ) as maxStudentNumber from Enrolment e" )
+ .setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ assertTrue( results instanceof Map );
+ Map resultMap = ( Map ) results;
+ assertEquals( 2, resultMap.size() );
+ assertEquals( yogiExpected.getStudentNumber(), resultMap.get( "minStudentNumber" ) );
+ assertEquals( shermanExpected.getStudentNumber(), resultMap.get( "maxStudentNumber" ) );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, true );
+ }
+
+ public void testOneNonEntityProjectionUnique() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use PassThroughTransformer by default
+ return s.createCriteria( Enrolment.class, "e" )
+ .setProjection( Projections.property( "e.semester" ) )
+ .add( Restrictions.eq( "e.studentNumber", shermanEnrolmentExpected.getStudentNumber() ) );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select e.semester from Enrolment e where e.studentNumber = :studentNumber" )
+ .setParameter( "studentNumber", shermanEnrolmentExpected.getStudentNumber() );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ assertTrue( results instanceof Short );
+ assertEquals( Short.valueOf( shermanEnrolmentExpected.getSemester() ), results );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, true );
+ }
+
+ public void testOneNonEntityProjectionList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use PassThroughTransformer by default
+ return s.createCriteria( Enrolment.class, "e" )
+ .setProjection( Projections.property( "e.semester" ) )
+ .addOrder( Order.asc( "e.studentNumber") );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select e.semester from Enrolment e order by e.studentNumber" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ assertEquals( yogiEnrolmentExpected.getSemester(), resultList.get( 0 ) );
+ assertEquals( shermanEnrolmentExpected.getSemester(), resultList.get( 1 ) );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testListElementsProjectionList() throws Exception {
+ /*
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use PassThroughTransformer by default
+ return s.createCriteria( Student.class, "s" )
+ .createCriteria( "s.secretCodes" )
+ .setProjection( Projections.property( "s.secretCodes" ) )
+ .addOrder( Order.asc( "s.studentNumber") );
+ }
+ };
+ */
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select elements(s.secretCodes) from Student s" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 3, resultList.size() );
+ assertTrue( resultList.contains( yogiExpected.getSecretCodes().get( 0 ) ) );
+ assertTrue( resultList.contains( shermanExpected.getSecretCodes().get( 0 ) ) );
+ assertTrue( resultList.contains( shermanExpected.getSecretCodes().get( 1 ) ) );
+ }
+ };
+ runTest( hqlExecutor, null, checker, false );
+ }
+
+ public void testOneEntityProjectionUnique() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use PassThroughTransformer by default
+ return s.createCriteria( Enrolment.class )
+ .setProjection( Projections.property( "student" ) )
+ .add( Restrictions.eq( "studentNumber", Long.valueOf( yogiExpected.getStudentNumber() ) ) );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select e.student from Enrolment e where e.studentNumber = :studentNumber" )
+ .setParameter( "studentNumber", Long.valueOf( yogiExpected.getStudentNumber() ) );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ assertTrue( results instanceof Student );
+ Student student = ( Student ) results;
+ if ( Hibernate.isInitialized( student ) ) {
+ assertEquals( yogiExpected, student );
+ }
+ else {
+ assertEquals( yogiExpected.getStudentNumber(), student.getStudentNumber() );
+ }
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, true );
+ }
+
+ public void testOneEntityProjectionList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ // should use PassThroughTransformer by default
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Enrolment.class, "e" )
+ .setProjection( Projections.property( "e.student" ) )
+ .addOrder( Order.asc( "e.studentNumber") );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select e.student from Enrolment e order by e.studentNumber" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ if ( Hibernate.isInitialized( resultList.get( 0 ) ) ) {
+ assertEquals( yogiExpected, resultList.get( 0 ) );
+ }
+ else {
+ assertEquals( yogiExpected.getStudentNumber(), ( ( Student ) resultList.get( 0 ) ).getStudentNumber() );
+ }
+ if ( Hibernate.isInitialized( resultList.get( 1 ) ) ) {
+ assertEquals( shermanExpected, resultList.get( 1 ) );
+ }
+ else {
+ assertEquals( shermanExpected.getStudentNumber(), ( ( Student ) resultList.get( 1 ) ).getStudentNumber() );
+ }
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testMultiEntityProjectionUnique() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use PassThroughTransformer by default
+ return s.createCriteria( Enrolment.class )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "student" ) )
+ .add( Property.forName( "semester" ) )
+ .add( Property.forName( "year" ) )
+ .add( Property.forName( "course" ) )
+ )
+ .add( Restrictions.eq( "studentNumber", Long.valueOf( shermanEnrolmentExpected.getStudentNumber() ) ) );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery(
+ "select e.student, e.semester, e.year, e.course from Enrolment e where e.studentNumber = :studentNumber" )
+ .setParameter( "studentNumber", shermanEnrolmentExpected.getStudentNumber() );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ assertTrue( results instanceof Object[] );
+ Object shermanObjects[] = ( Object [] ) results;
+ assertEquals( 4, shermanObjects.length );
+ //assertTrue( shermanObjects[ 0 ] instanceof HibernateProxy );
+ assertTrue( shermanObjects[ 0 ] instanceof Student );
+ if ( Hibernate.isInitialized( shermanObjects[ 0 ] ) ) {
+ assertEquals( shermanExpected, shermanObjects[ 0 ] );
+ }
+ assertEquals( shermanEnrolmentExpected.getSemester(), ( (Short) shermanObjects[ 1 ] ).shortValue() );
+ assertEquals( shermanEnrolmentExpected.getYear(), ( (Short) shermanObjects[ 2 ] ).shortValue() );
+ assertTrue( ! ( shermanObjects[ 3 ] instanceof HibernateProxy ) );
+ assertTrue( shermanObjects[ 3 ] instanceof Course );
+ assertEquals( courseExpected, shermanObjects[ 3 ] );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, true );
+ }
+
+ public void testMultiEntityProjectionList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ // should use PassThroughTransformer by default
+ return s.createCriteria( Enrolment.class, "e" )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "e.student" ) )
+ .add( Property.forName( "e.semester" ) )
+ .add( Property.forName( "e.year" ) )
+ .add( Property.forName( "e.course" ) )
+ )
+ .addOrder( Order.asc( "e.studentNumber") );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select e.student, e.semester, e.year, e.course from Enrolment e order by e.studentNumber" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ Object[] yogiObjects = ( Object[] ) resultList.get( 0 );
+ Object[] shermanObjects = ( Object[] ) resultList.get( 1 );
+ assertEquals( 4, yogiObjects.length );
+ //assertTrue( yogiObjects[ 0 ] instanceof HibernateProxy );
+ assertTrue( yogiObjects[ 0 ] instanceof Student );
+ if( Hibernate.isInitialized( yogiObjects[ 0 ] ) ) {
+ assertEquals( yogiExpected, yogiObjects[ 0 ] );
+ }
+ assertEquals( yogiEnrolmentExpected.getSemester(), ( (Short) yogiObjects[ 1 ] ).shortValue() );
+ assertEquals( yogiEnrolmentExpected.getYear(), ( (Short) yogiObjects[ 2 ] ).shortValue() );
+ assertEquals( courseExpected, yogiObjects[ 3 ] );
+ //assertTrue( shermanObjects[ 0 ] instanceof HibernateProxy );
+ assertTrue( shermanObjects[ 0 ] instanceof Student );
+ if ( Hibernate.isInitialized( shermanObjects[ 0 ] ) ) {
+ assertEquals( shermanExpected, shermanObjects[ 0 ] );
+ }
+ assertEquals( shermanEnrolmentExpected.getSemester(), ( (Short) shermanObjects[ 1 ] ).shortValue() );
+ assertEquals( shermanEnrolmentExpected.getYear(), ( (Short) shermanObjects[ 2 ] ).shortValue() );
+ //assertTrue( ! ( shermanObjects[ 3 ] instanceof HibernateProxy ) );
+ assertTrue( shermanObjects[ 3 ] instanceof Course );
+ assertEquals( courseExpected, shermanObjects[ 3 ] );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testSingleAggregatedPropProjectionSingleResult() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Enrolment.class )
+ .setProjection( Projections.min( "studentNumber" ) );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select min( e.studentNumber ) from Enrolment e" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ assertTrue( results instanceof Long );
+ assertEquals( Long.valueOf( yogiExpected.getStudentNumber() ), results );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, true );
+ }
+
+ public void testMultiAggregatedPropProjectionSingleResult() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Enrolment.class )
+ .setProjection(
+ Projections.projectionList()
+ .add( Projections.min( "studentNumber" ).as( "minStudentNumber" ) )
+ .add( Projections.max( "studentNumber" ).as( "maxStudentNumber" ) )
+ );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery(
+ "select min( e.studentNumber ) as minStudentNumber, max( e.studentNumber ) as maxStudentNumber from Enrolment e" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ assertTrue( results instanceof Object[] );
+ Object[] resultObjects = ( Object[] ) results;
+ assertEquals( Long.valueOf( yogiExpected.getStudentNumber() ), resultObjects[ 0 ] );
+ assertEquals( Long.valueOf( shermanExpected.getStudentNumber() ), resultObjects[ 1 ] );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, true );
+ }
+
+ public void testAliasToBeanDtoOneArgList() throws Exception {
+
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Enrolment.class, "e" )
+ .createAlias( "e.student", "st" )
+ .createAlias( "e.course", "co" )
+ .setProjection( Projections.property( "st.name" ).as( "studentName" ) )
+ .addOrder( Order.asc( "st.studentNumber" ) )
+ .setResultTransformer( Transformers.aliasToBean( StudentDTO.class ) );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select st.name as studentName from Student st order by st.studentNumber" )
+ .setResultTransformer( Transformers.aliasToBean( StudentDTO.class ) );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ StudentDTO dto = ( StudentDTO ) resultList.get( 0 );
+ assertNull( dto.getDescription() );
+ assertEquals( yogiExpected.getName(), dto.getName() );
+ dto = ( StudentDTO ) resultList.get( 1 );
+ assertNull( dto.getDescription() );
+ assertEquals( shermanExpected.getName(), dto.getName() );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testAliasToBeanDtoMultiArgList() throws Exception {
+
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Enrolment.class, "e" )
+ .createAlias( "e.student", "st" )
+ .createAlias( "e.course", "co" )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "st.name" ).as( "studentName" ) )
+ .add( Property.forName( "co.description" ).as( "courseDescription" ) )
+ )
+ .addOrder( Order.asc( "e.studentNumber" ) )
+ .setResultTransformer( Transformers.aliasToBean( StudentDTO.class ) );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select st.name as studentName, co.description as courseDescription from Enrolment e join e.student st join e.course co order by e.studentNumber" )
+ .setResultTransformer( Transformers.aliasToBean( StudentDTO.class ) );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ StudentDTO dto = ( StudentDTO ) resultList.get( 0 );
+ assertEquals( courseExpected.getDescription(), dto.getDescription() );
+ assertEquals( yogiExpected.getName(), dto.getName() );
+ dto = ( StudentDTO ) resultList.get( 1 );
+ assertEquals( courseExpected.getDescription(), dto.getDescription() );
+ assertEquals( shermanExpected.getName(), dto.getName() );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testAliasToBeanDtoLiteralArgList() throws Exception {
+
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Enrolment.class, "e" )
+ .createAlias( "e.student", "st" )
+ .createAlias( "e.course", "co" )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "st.name" ).as( "studentName" ) )
+ .add( Projections.sqlProjection(
+ "'lame description' as courseDescription",
+ new String[] { "courseDescription" },
+ new Type[] { Hibernate.STRING }
+ )
+ )
+ )
+ .addOrder( Order.asc( "e.studentNumber" ) )
+ .setResultTransformer( Transformers.aliasToBean( StudentDTO.class ) );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select st.name as studentName, 'lame description' as courseDescription from Enrolment e join e.student st join e.course co order by e.studentNumber" )
+ .setResultTransformer( Transformers.aliasToBean( StudentDTO.class ) );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ StudentDTO dto = ( StudentDTO ) resultList.get( 0 );
+ assertEquals( "lame description", dto.getDescription() );
+ assertEquals( yogiExpected.getName(), dto.getName() );
+ dto = ( StudentDTO ) resultList.get( 1 );
+ assertEquals( "lame description", dto.getDescription() );
+ assertEquals( shermanExpected.getName(), dto.getName() );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testAliasToBeanDtoWithNullAliasList() throws Exception {
+
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Enrolment.class, "e" )
+ .createAlias( "e.student", "st" )
+ .createAlias( "e.course", "co" )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "st.name" ).as( "studentName" ) )
+ .add( Property.forName( "st.studentNumber" ) )
+ .add( Property.forName( "co.description" ).as( "courseDescription" ) )
+ )
+ .addOrder( Order.asc( "e.studentNumber" ) )
+ .setResultTransformer( Transformers.aliasToBean( StudentDTO.class ) );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select st.name as studentName, co.description as courseDescription from Enrolment e join e.student st join e.course co order by e.studentNumber" )
+ .setResultTransformer( Transformers.aliasToBean( StudentDTO.class ) );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ StudentDTO dto = ( StudentDTO ) resultList.get( 0 );
+ assertEquals( courseExpected.getDescription(), dto.getDescription() );
+ assertEquals( yogiExpected.getName(), dto.getName() );
+ dto = ( StudentDTO ) resultList.get( 1 );
+ assertEquals( courseExpected.getDescription(), dto.getDescription() );
+ assertEquals( shermanExpected.getName(), dto.getName() );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testOneSelectNewList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) throws Exception {
+ return s.createCriteria( Student.class, "s" )
+ .setProjection( Projections.property( "s.name" ) )
+ .addOrder( Order.asc( "s.studentNumber" ) )
+ .setResultTransformer( new AliasToBeanConstructorResultTransformer( getConstructor() ) );
+ }
+ private Constructor getConstructor() throws NoSuchMethodException {
+ return StudentDTO.class.getConstructor( PersonName.class );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select new org.hibernate.test.querycache.StudentDTO(s.name) from Student s order by s.studentNumber" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ StudentDTO yogi = ( StudentDTO ) resultList.get( 0 );
+ assertNull( yogi.getDescription() );
+ assertEquals( yogiExpected.getName(), yogi.getName() );
+ StudentDTO sherman = ( StudentDTO ) resultList.get( 1 );
+ assertEquals( shermanExpected.getName(), sherman.getName() );
+ assertNull( sherman.getDescription() );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testMultiSelectNewList() throws Exception{
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) throws Exception {
+ return s.createCriteria( Student.class, "s" )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "s.studentNumber" ) )
+ .add( Property.forName( "s.name" ) )
+ )
+ .addOrder( Order.asc( "s.studentNumber" ) )
+ .setResultTransformer( new AliasToBeanConstructorResultTransformer( getConstructor() ) );
+ }
+ private Constructor getConstructor() throws NoSuchMethodException {
+ return Student.class.getConstructor( long.class, PersonName.class );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select new Student(s.studentNumber, s.name) from Student s order by s.studentNumber" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ Student yogi = ( Student ) resultList.get( 0 );
+ assertEquals( yogiExpected.getStudentNumber(), yogi.getStudentNumber() );
+ assertEquals( yogiExpected.getName(), yogi.getName() );
+ Student sherman = ( Student ) resultList.get( 1 );
+ assertEquals( shermanExpected.getStudentNumber(), sherman.getStudentNumber() );
+ assertEquals( shermanExpected.getName(), sherman.getName() );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testMultiSelectNewWithLiteralList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) throws Exception {
+ return s.createCriteria( Student.class, "s" )
+ .setProjection(
+ Projections.projectionList()
+ .add( Projections.sqlProjection( "555 as sCode", new String[]{ "sCode" }, new Type[] { Hibernate.LONG } ) )
+ .add( Property.forName( "s.name" ) )
+ )
+ .addOrder( Order.asc( "s.studentNumber" ) )
+ .setResultTransformer( new AliasToBeanConstructorResultTransformer( getConstructor() ) );
+ }
+ private Constructor getConstructor() throws NoSuchMethodException {
+ return Student.class.getConstructor( long.class, PersonName.class );
+ }
+ };
+
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select new Student(555L, s.name) from Student s order by s.studentNumber" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ Student yogi = ( Student ) resultList.get( 0 );
+ assertEquals( 555L, yogi.getStudentNumber() );
+ assertEquals( yogiExpected.getName(), yogi.getName() );
+ Student sherman = ( Student ) resultList.get( 1 );
+ assertEquals( 555L, sherman.getStudentNumber() );
+ assertEquals( shermanExpected.getName(), sherman.getName() );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testMultiSelectNewListList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Student.class, "s" )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "s.studentNumber" ) )
+ .add( Property.forName( "s.name" ) )
+ )
+ .addOrder( Order.asc( "s.studentNumber" ) )
+ .setResultTransformer( Transformers.TO_LIST );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select new list(s.studentNumber, s.name) from Student s order by s.studentNumber" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ List yogiList = ( List ) resultList.get( 0 );
+ assertEquals( yogiExpected.getStudentNumber(), yogiList.get( 0 ) );
+ assertEquals( yogiExpected.getName(), yogiList.get( 1 ) );
+ List shermanList = ( List ) resultList.get( 1 );
+ assertEquals( shermanExpected.getStudentNumber(), shermanList.get( 0 ) );
+ assertEquals( shermanExpected.getName(), shermanList.get( 1 ) );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testMultiSelectNewMapList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Student.class, "s" )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "s.studentNumber" ).as( "sNumber" ) )
+ .add( Property.forName( "s.name" ).as( "sName" ) )
+ )
+ .addOrder( Order.asc( "s.studentNumber" ) )
+ .setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select new map(s.studentNumber as sNumber, s.name as sName) from Student s order by s.studentNumber" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ Map yogiMap = ( Map ) resultList.get( 0 );
+ assertEquals( yogiExpected.getStudentNumber(), yogiMap.get( "sNumber" ) );
+ assertEquals( yogiExpected.getName(), yogiMap.get( "sName" ) );
+ Map shermanMap = ( Map ) resultList.get( 1 );
+ assertEquals( shermanExpected.getStudentNumber(), shermanMap.get( "sNumber" ) );
+ assertEquals( shermanExpected.getName(), shermanMap.get( "sName" ) );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testSelectNewEntityConstructorList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Student.class, "s" )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "s.studentNumber" ) )
+ .add( Property.forName( "s.name" ) )
+ )
+ .addOrder( Order.asc( "s.studentNumber" ) )
+ .setResultTransformer( new AliasToBeanConstructorResultTransformer( getConstructor() ) );
+ }
+ private Constructor getConstructor() {
+ Type studentNametype =
+ ( ( SessionFactoryImpl ) getSessions() )
+ .getEntityPersister( Student.class.getName() )
+ .getPropertyType( "name" );
+ return ReflectHelper.getConstructor( Student.class, new Type[] { Hibernate.LONG, studentNametype } );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select new Student(s.studentNumber, s.name) from Student s order by s.studentNumber" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ Student yogi = ( Student ) resultList.get( 0 );
+ assertEquals( yogiExpected.getStudentNumber(), yogi.getStudentNumber() );
+ assertEquals( yogiExpected.getName(), yogi.getName() );
+ Student sherman = ( Student ) resultList.get( 1 );
+ assertEquals( shermanExpected.getStudentNumber(), sherman.getStudentNumber() );
+ assertEquals( shermanExpected.getName(), sherman.getName() );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testMapKeyList() throws Exception {
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.addresses", "a" )
+ .setProjection( Projections.property( "a.addressType" ) );
+ }
+ };
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select key(s.addresses) from Student s" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ assertTrue( resultList.contains( "home" ) );
+ assertTrue( resultList.contains( "work" ) );
+ }
+ };
+ runTest( hqlExecutor, criteriaExecutor, checker, false );
+ }
+
+ public void testMapValueList() throws Exception {
+ /*
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.addresses", "a" )
+ .setProjection( Projections.property( "s.addresses" ));
+ }
+ };
+ */
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select value(s.addresses) from Student s" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ assertTrue( resultList.contains( yogiExpected.getAddresses().get( "home" ) ) );
+ assertTrue( resultList.contains( yogiExpected.getAddresses().get( "work" ) ) );
+ }
+ };
+ runTest( hqlExecutor, null, checker, false );
+ }
+
+ public void testMapEntryList() throws Exception {
+ /*
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.addresses", "a" )
+ .setProjection(
+ Projections.projectionList()
+ .add( Projections.property( "a.addressType" ) )
+ .add( Projections.property( "s.addresses" ).as( "a" ) );
+ )
+ }
+ };
+ */
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select entry(s.addresses) from Student s" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ Iterator it=resultList.iterator();
+ assertTrue( resultList.get( 0 ) instanceof Map.Entry );
+ Map.Entry entry = ( Map.Entry ) it.next();
+ if ( "home".equals( entry.getKey() ) ) {
+ assertTrue( yogiExpected.getAddresses().get( "home" ).equals( entry.getValue() ) );
+ entry = ( Map.Entry ) it.next();
+ assertTrue( yogiExpected.getAddresses().get( "work" ).equals( entry.getValue() ) );
+ }
+ else {
+ assertTrue( "work".equals( entry.getKey() ) );
+ assertTrue( yogiExpected.getAddresses().get( "work" ).equals( entry.getValue() ) );
+ entry = ( Map.Entry ) it.next();
+ assertTrue( yogiExpected.getAddresses().get( "home" ).equals( entry.getValue() ) );
+ }
+ }
+ };
+ runTest( hqlExecutor, null, checker, false );
+ }
+
+ public void testMapElementsList() throws Exception {
+ /*
+ CriteriaExecutor criteriaExecutor = new CriteriaExecutor() {
+ protected Criteria getCriteria(Session s) {
+ return s.createCriteria( Student.class, "s" )
+ .createAlias( "s.addresses", "a", Criteria.INNER_JOIN )
+ .setProjection( Projections.property( "s.addresses" ) );
+ }
+ };
+ */
+ HqlExecutor hqlExecutor = new HqlExecutor() {
+ public Query getQuery(Session s) {
+ return s.createQuery( "select elements(a) from Student s inner join s.addresses a" );
+ }
+ };
+ ResultChecker checker = new ResultChecker() {
+ public void check(Object results) {
+ List resultList = ( List ) results;
+ assertEquals( 2, resultList.size() );
+ assertTrue( resultList.contains( yogiExpected.getAddresses().get( "home" ) ) );
+ assertTrue( resultList.contains( yogiExpected.getAddresses().get( "work" ) ) );
+ }
+ };
+ runTest( hqlExecutor, null, checker, false );
+ }
+
+ protected void runTest(HqlExecutor hqlExecutor, CriteriaExecutor criteriaExecutor, ResultChecker checker, boolean isSingleResult)
+ throws Exception {
+ createData();
+ if ( criteriaExecutor != null ) {
+ runTest( criteriaExecutor, checker, isSingleResult );
+ }
+ if ( hqlExecutor != null ) {
+ runTest( hqlExecutor, checker, isSingleResult );
+ }
+ deleteData();
+ }
+
+ private boolean isQueryCacheGetEnabled() {
+ return getQueryCacheMode() == CacheMode.NORMAL ||
+ getQueryCacheMode() == CacheMode.GET;
+ }
+
+ private boolean isQueryCachePutEnabled() {
+ return getQueryCacheMode() == CacheMode.NORMAL ||
+ getQueryCacheMode() == CacheMode.PUT;
+ }
+
+ protected void runTest(QueryExecutor queryExecutor, ResultChecker resultChecker, boolean isSingleResult) throws Exception{
+ clearCache();
+ clearStatistics();
+
+ Object results = queryExecutor.execute( isSingleResult );
+
+ assertHitCount( 0 );
+ assertMissCount( isQueryCacheGetEnabled() ? 1 : 0 );
+ assertPutCount( isQueryCachePutEnabled() ? 1 : 0 );
+ clearStatistics();
+
+ resultChecker.check( results );
+
+ // check again to make sure nothing got initialized while checking results;
+ assertHitCount( 0 );
+ assertMissCount( 0 );
+ assertPutCount( 0 );
+ clearStatistics();
+
+ results = queryExecutor.execute( isSingleResult );
+
+ assertHitCount( isQueryCacheGetEnabled() ? 1 : 0 );
+ assertMissCount( 0 );
+ assertPutCount( ! isQueryCacheGetEnabled() && isQueryCachePutEnabled() ? 1 : 0 );
+ clearStatistics();
+
+ resultChecker.check( results );
+
+ // check again to make sure nothing got initialized while checking results;
+ assertHitCount( 0 );
+ assertMissCount( 0 );
+ assertPutCount( 0 );
+ clearStatistics();
+ }
+
+ private void multiPropProjectionNoTransformerDynNonLazy(CacheMode sessionCacheMode,
+ boolean isCacheableQuery) {
+ Session s = openSession();
+ s.setCacheMode( sessionCacheMode );
+ Transaction t = s.beginTransaction();
+ List resultList = s.createCriteria( Enrolment.class )
+ .setCacheable( isCacheableQuery )
+ .setFetchMode( "student", FetchMode.JOIN )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "student" ), "student" )
+ .add( Property.forName( "semester" ), "semester" )
+ .add( Property.forName( "year" ), "year" )
+ .add( Property.forName( "course" ), "course" )
+ )
+ .addOrder( Order.asc( "studentNumber") )
+ .list();
+ t.commit();
+ s.close();
+
+ assertEquals( 2, resultList.size() );
+ Object[] yogiObjects = ( Object[] ) resultList.get( 0 );
+ Object[] shermanObjects = ( Object[] ) resultList.get( 1 );
+ assertEquals( 4, yogiObjects.length );
+ assertTrue( yogiObjects[ 0 ] instanceof Student );
+ assertTrue( Hibernate.isInitialized( yogiObjects[ 0 ] ) );
+ assertEquals( yogiEnrolmentExpected.getSemester(), ( (Short) yogiObjects[ 1 ] ).shortValue() );
+ assertEquals( yogiEnrolmentExpected.getYear(), ( (Short) yogiObjects[ 2 ] ).shortValue() );
+ assertEquals( courseExpected, yogiObjects[ 3 ] );
+ assertTrue( shermanObjects[ 0 ] instanceof Student );
+ assertTrue( Hibernate.isInitialized( shermanObjects[ 0 ] ) );
+ assertEquals( shermanEnrolmentExpected.getSemester(), ( (Short) shermanObjects[ 1 ] ).shortValue() );
+ assertEquals( shermanEnrolmentExpected.getYear(), ( (Short) shermanObjects[ 2 ] ).shortValue() );
+ assertTrue( ! ( shermanObjects[ 3 ] instanceof HibernateProxy ) );
+ assertTrue( shermanObjects[ 3 ] instanceof Course );
+ assertEquals( courseExpected, shermanObjects[ 3 ] );
+ }
+
+/*
+ {
+
+ assertEquals( 2, resultList.size() );
+ Object[] yogiObjects = ( Object[] ) resultList.get( 0 );
+ Object[] shermanObjects = ( Object[] ) resultList.get( 1 );
+ assertEquals( 4, yogiObjects.length );
+ assertEquals( yogiExpected, ( Student ) yogiObjects[ 0 ] );
+ assertEquals( yogiEnrolmentExpected.getSemester(), ( (Short) yogiObjects[ 1 ] ).shortValue() );
+ assertEquals( yogiEnrolmentExpected.getYear(), ( (Short) yogiObjects[ 2 ] ).shortValue() );
+ assertEquals( courseExpected, yogiObjects[ 3 ] );
+ assertEquals( shermanExpected, ( Student ) shermanObjects[ 0 ] );
+ assertEquals( shermanEnrolmentExpected.getSemester(), ( (Short) shermanObjects[ 1 ] ).shortValue() );
+ assertEquals( shermanEnrolmentExpected.getYear(), ( (Short) shermanObjects[ 2 ] ).shortValue() );
+ assertEquals( courseExpected, shermanObjects[ 3 ] );
+
+ }
+
+*/
+/*
+ private void executeProperty() {
+ resultList = s.createCriteria( Student.class )
+ .setCacheable( true )
+ .setProjection(
+ Projections.projectionList()
+ .add( Projections.id().as( "studentNumber" ) )
+ .add( Property.forName( "name" ), "name" )
+ .add( Property.forName( "cityState" ), "cityState" )
+ .add( Property.forName( "preferredCourse" ), "preferredCourse" )
+ )
+ .list();
+ assertEquals( 2, resultList.size() );
+ for ( Iterator it = resultList.iterator(); it.hasNext(); ) {
+ Object[] objects = ( Object[] ) it.next();
+ assertEquals( 4, objects.length );
+ assertTrue( objects[0] instanceof Long );
+ assertTrue( objects[1] instanceof String );
+ if ( "yogiExpected King".equals( objects[1] ) ) {
+ assertTrue( objects[2] instanceof Name );
+ assertTrue( objects[3] instanceof Course );
+ }
+ else {
+ assertNull( objects[2] );
+ assertNull( objects[3] );
+ }
+ }
+
+ Object[] aResult = ( Object[] ) s.createCriteria( Student.class )
+ .setCacheable( true )
+ .add( Restrictions.idEq( new Long( 667 ) ) )
+ .setProjection(
+ Projections.projectionList()
+ .add( Projections.id().as( "studentNumber" ) )
+ .add( Property.forName( "name" ), "name" )
+ .add( Property.forName( "cityState" ), "cityState" )
+ .add( Property.forName( "preferredCourse" ), "preferredCourse" )
+ )
+ .uniqueResult();
+ assertNotNull( aResult );
+ assertEquals( 4, aResult.length );
+ assertTrue( aResult[0] instanceof Long );
+ assertTrue( aResult[1] instanceof String );
+ assertTrue( aResult[2] instanceof Name );
+ assertTrue( aResult[3] instanceof Course );
+
+ Long count = ( Long ) s.createCriteria( Enrolment.class )
+ .setCacheable( true )
+ .setProjection( Property.forName( "studentNumber" ).count().setDistinct() )
+ .uniqueResult();
+ assertEquals( count, new Long( 2 ) );
+
+ Object object = s.createCriteria( Enrolment.class )
+ .setCacheable( true )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "studentNumber" ).count() )
+ .add( Property.forName( "studentNumber" ).max() )
+ .add( Property.forName( "studentNumber" ).min() )
+ .add( Property.forName( "studentNumber" ).avg() )
+ )
+ .uniqueResult();
+ Object[] result = ( Object[] ) object;
+
+ assertEquals( new Long( 2 ), result[0] );
+ assertEquals( new Long( 667 ), result[1] );
+ assertEquals( new Long( 101 ), result[2] );
+ assertEquals( 384.0, ( ( Double ) result[3] ).doubleValue(), 0.01 );
+
+
+ s.createCriteria( Enrolment.class )
+ .setCacheable( true )
+ .add( Property.forName( "studentNumber" ).gt( new Long( 665 ) ) )
+ .add( Property.forName( "studentNumber" ).lt( new Long( 668 ) ) )
+ .add( Property.forName( "courseCode" ).like( "HIB", MatchMode.START ) )
+ .add( Property.forName( "year" ).eq( new Short( ( short ) 1999 ) ) )
+ .addOrder( Property.forName( "studentNumber" ).asc() )
+ .uniqueResult();
+
+ List resultWithMaps = s.createCriteria( Enrolment.class )
+ .setCacheable( true )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "studentNumber" ).as( "stNumber" ) )
+ .add( Property.forName( "courseCode" ).as( "cCode" ) )
+ )
+ .add( Property.forName( "studentNumber" ).gt( new Long( 665 ) ) )
+ .add( Property.forName( "studentNumber" ).lt( new Long( 668 ) ) )
+ .addOrder( Property.forName( "studentNumber" ).asc() )
+ .setResultTransformer( Criteria.ALIAS_TO_ENTITY_MAP )
+ .list();
+
+ assertEquals( 1, resultWithMaps.size() );
+ Map m1 = ( Map ) resultWithMaps.get( 0 );
+
+ assertEquals( new Long( 667 ), m1.get( "stNumber" ) );
+ assertEquals( courseExpected.getCourseCode(), m1.get( "cCode" ) );
+
+ resultWithMaps = s.createCriteria( Enrolment.class )
+ .setCacheable( true )
+ .setProjection( Property.forName( "studentNumber" ).as( "stNumber" ) )
+ .addOrder( Order.desc( "stNumber" ) )
+ .setResultTransformer( Criteria.ALIAS_TO_ENTITY_MAP )
+ .list();
+
+ assertEquals( 2, resultWithMaps.size() );
+ Map m0 = ( Map ) resultWithMaps.get( 0 );
+ m1 = ( Map ) resultWithMaps.get( 1 );
+
+ assertEquals( new Long( 101 ), m1.get( "stNumber" ) );
+ assertEquals( new Long( 667 ), m0.get( "stNumber" ) );
+
+ List resultWithAliasedBean = s.createCriteria( Enrolment.class )
+ .setCacheable( true )
+ .createAlias( "student", "st" )
+ .createAlias( "courseExpected", "co" )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "st.name" ).as( "studentName" ) )
+ .add( Property.forName( "co.description" ).as( "courseDescription" ) )
+ )
+ .addOrder( Order.desc( "studentName" ) )
+ .setResultTransformer( Transformers.aliasToBean( StudentDTO.class ) )
+ .list();
+
+ assertEquals( 2, resultWithAliasedBean.size() );
+
+ StudentDTO dto = ( StudentDTO ) resultWithAliasedBean.get( 0 );
+ assertNotNull( dto.getDescription() );
+ assertNotNull( dto.getName() );
+
+ CourseMeeting courseMeetingDto = ( CourseMeeting ) s.createCriteria( CourseMeeting.class )
+ .setCacheable( true )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "id" ).as( "id" ) )
+ .add( Property.forName( "courseExpected" ).as( "courseExpected" ) )
+ )
+ .addOrder( Order.desc( "id" ) )
+ .setResultTransformer( Transformers.aliasToBean( CourseMeeting.class ) )
+ .uniqueResult();
+
+ assertNotNull( courseMeetingDto.getId() );
+ assertEquals( courseExpected.getCourseCode(), courseMeetingDto.getId().getCourseCode() );
+ assertEquals( "Monday", courseMeetingDto.getId().getDay() );
+ assertEquals( "1313 Mockingbird Lane", courseMeetingDto.getId().getLocation() );
+ assertEquals( 1, courseMeetingDto.getId().getPeriod() );
+ assertEquals( courseExpected.getDescription(), courseMeetingDto.getCourse().getDescription() );
+
+ s.createCriteria( Student.class )
+ .setCacheable( true )
+ .add( Restrictions.like( "name", "yogiExpected", MatchMode.START ) )
+ .addOrder( Order.asc( "name" ) )
+ .createCriteria( "enrolments", "e" )
+ .addOrder( Order.desc( "year" ) )
+ .addOrder( Order.desc( "semester" ) )
+ .createCriteria( "courseExpected", "c" )
+ .addOrder( Order.asc( "description" ) )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "this.name" ) )
+ .add( Property.forName( "e.year" ) )
+ .add( Property.forName( "e.semester" ) )
+ .add( Property.forName( "c.courseCode" ) )
+ .add( Property.forName( "c.description" ) )
+ )
+ .uniqueResult();
+
+ Projection p1 = Projections.projectionList()
+ .add( Property.forName( "studentNumber" ).count() )
+ .add( Property.forName( "studentNumber" ).max() )
+ .add( Projections.rowCount() );
+
+ Projection p2 = Projections.projectionList()
+ .add( Property.forName( "studentNumber" ).min() )
+ .add( Property.forName( "studentNumber" ).avg() )
+ .add(
+ Projections.sqlProjection(
+ "1 as constOne, count(*) as countStar",
+ new String[] { "constOne", "countStar" },
+ new Type[] { Hibernate.INTEGER, Hibernate.INTEGER }
+ )
+ );
+
+ Object[] array = ( Object[] ) s.createCriteria( Enrolment.class )
+ .setCacheable( true )
+ .setProjection( Projections.projectionList().add( p1 ).add( p2 ) )
+ .uniqueResult();
+
+ assertEquals( array.length, 7 );
+
+ List list = s.createCriteria( Enrolment.class )
+ .setCacheable( true )
+ .createAlias( "student", "st" )
+ .createAlias( "courseExpected", "co" )
+ .setProjection(
+ Projections.projectionList()
+ .add( Property.forName( "co.courseCode" ).group() )
+ .add( Property.forName( "st.studentNumber" ).count().setDistinct() )
+ .add( Property.forName( "year" ).group() )
+ )
+ .list();
+
+ assertEquals( list.size(), 2 );
+ }
+*/
+ protected void clearCache() {
+ getSessions().getCache().evictQueryRegions();
+ }
+
+ protected void clearStatistics() {
+ getSessions().getStatistics().clear();
+ }
+
+ protected void assertEntityFetchCount(int expected) {
+ int actual = ( int ) getSessions().getStatistics().getEntityFetchCount();
+ assertEquals( expected, actual );
+ }
+
+ protected void assertCount(int expected) {
+ int actual = ( int ) getSessions().getStatistics().getQueries().length;
+ assertEquals( expected, actual );
+ }
+
+ protected void assertHitCount(int expected) {
+ int actual = ( int ) getSessions().getStatistics().getQueryCacheHitCount();
+ assertEquals( expected, actual );
+ }
+
+ protected void assertMissCount(int expected) {
+ int actual = ( int ) getSessions().getStatistics().getQueryCacheMissCount();
+ assertEquals( expected, actual );
+ }
+
+ protected void assertPutCount(int expected) {
+ int actual = ( int ) getSessions().getStatistics().getQueryCachePutCount();
+ assertEquals( expected, actual );
+ }
+
+ protected void assertInsertCount(int expected) {
+ int inserts = ( int ) getSessions().getStatistics().getEntityInsertCount();
+ assertEquals( "unexpected insert count", expected, inserts );
+ }
+
+ protected void assertUpdateCount(int expected) {
+ int updates = ( int ) getSessions().getStatistics().getEntityUpdateCount();
+ assertEquals( "unexpected update counts", expected, updates );
+ }
+
+ protected void assertDeleteCount(int expected) {
+ int deletes = ( int ) getSessions().getStatistics().getEntityDeleteCount();
+ assertEquals( "unexpected delete counts", expected, deletes );
+ }
+}
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Address.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Address.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Address.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,134 @@
+// $Id: Address.java 7996 2005-08-22 14:49:57Z steveebersole $
+package org.hibernate.test.querycache;
+
+/**
+ * Implementation of Address.
+ *
+ * @author Steve Ebersole
+ */
+public class Address {
+ private long id;
+ private String addressType;
+ private String street;
+ private String city;
+ private String stateProvince;
+ private String postalCode;
+ private String country;
+ private Student student;
+
+ public Address() {}
+
+ public Address(Student student, String type, String street, String city, String stateProvince, String postalCode, String country) {
+ this.student = student;
+ this.addressType = type;
+ this.street = street;
+ this.city = city;
+ this.stateProvince = stateProvince;
+ this.postalCode = postalCode;
+ this.country = country;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public Student getStudent() {
+ return student;
+ }
+
+ public void setStudent(Student student) {
+ this.student = student;
+ }
+
+ public String getAddressType() {
+ return addressType;
+ }
+
+ public void setAddressType(String addressType) {
+ this.addressType = addressType;
+ }
+
+ public String getStreet() {
+ return street;
+ }
+
+ public void setStreet(String street) {
+ this.street = street;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getPostalCode() {
+ return postalCode;
+ }
+
+ public void setPostalCode(String postalCode) {
+ this.postalCode = postalCode;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ public String getStateProvince() {
+ return stateProvince;
+ }
+
+ public void setStateProvince(String stateProvince) {
+ this.stateProvince = stateProvince;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( o == null || getClass() != o.getClass() ) {
+ return false;
+ }
+
+ Address address = ( Address ) o;
+
+ if ( city != null ? !city.equals( address.city ) : address.city != null ) {
+ return false;
+ }
+ if ( country != null ? !country.equals( address.country ) : address.country != null ) {
+ return false;
+ }
+ if ( postalCode != null ? !postalCode.equals( address.postalCode ) : address.postalCode != null ) {
+ return false;
+ }
+ if ( stateProvince != null ? !stateProvince.equals( address.stateProvince ) : address.stateProvince != null ) {
+ return false;
+ }
+ if ( street != null ? !street.equals( address.street ) : address.street != null ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = street != null ? street.hashCode() : 0;
+ result = 31 * result + ( city != null ? city.hashCode() : 0 );
+ result = 31 * result + ( stateProvince != null ? stateProvince.hashCode() : 0 );
+ result = 31 * result + ( postalCode != null ? postalCode.hashCode() : 0 );
+ result = 31 * result + ( country != null ? country.hashCode() : 0 );
+ return result;
+ }
+}
\ No newline at end of file
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Course.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Course.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Course.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,60 @@
+//$Id: Course.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.querycache;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Course implements Serializable {
+ private String courseCode;
+ private String description;
+ private Set courseMeetings = new HashSet();
+
+ public String getCourseCode() {
+ return courseCode;
+ }
+ public void setCourseCode(String courseCode) {
+ this.courseCode = courseCode;
+ }
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+ public Set getCourseMeetings() {
+ return courseMeetings;
+ }
+ public void setCourseMeetings(Set courseMeetings) {
+ this.courseMeetings = courseMeetings;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( o == null || ! ( o instanceof Course ) ) {
+ return false;
+ }
+
+ Course course = ( Course ) o;
+
+ if ( courseCode != null ? !courseCode.equals( course.getCourseCode() ) : course.getCourseCode() != null ) {
+ return false;
+ }
+ if ( description != null ? !description.equals( course.getDescription() ) : course.getDescription() != null ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result = courseCode != null ? courseCode.hashCode() : 0;
+ result = 31 * result + ( description != null ? description.hashCode() : 0 );
+ return result;
+ }
+}
\ No newline at end of file
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CourseMeeting.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CourseMeeting.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CourseMeeting.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,55 @@
+package org.hibernate.test.querycache;
+
+/**
+ * @author Gail Badner
+ */
+public class CourseMeeting {
+ private CourseMeetingId id;
+ private Course course;
+
+ public CourseMeeting() {}
+
+ public CourseMeeting(Course course, String day, int period, String location) {
+ this.id = new CourseMeetingId( course, day, period, location );
+ this.course = course;
+ }
+
+ public CourseMeetingId getId() {
+ return id;
+ }
+ public void setId(CourseMeetingId id) {
+ this.id = id;
+ }
+ public Course getCourse() {
+ return course;
+ }
+ public void setCourse(Course course) {
+ this.course = course;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( o == null || getClass() != o.getClass() ) {
+ return false;
+ }
+
+ CourseMeeting that = ( CourseMeeting ) o;
+
+ if ( course != null ? !course.equals( that.course ) : that.course != null ) {
+ return false;
+ }
+ if ( id != null ? !id.equals( that.id ) : that.id != null ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result = id != null ? id.hashCode() : 0;
+ result = 31 * result + ( course != null ? course.hashCode() : 0 );
+ return result;
+ }
+}
\ No newline at end of file
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CourseMeetingId.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CourseMeetingId.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CourseMeetingId.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,81 @@
+package org.hibernate.test.querycache;
+
+import java.io.Serializable;
+
+/**
+ * @author Gail Badner
+ */
+public class CourseMeetingId implements Serializable {
+ private String courseCode;
+ private String day;
+ private int period;
+ private String location;
+
+ public CourseMeetingId() {}
+
+ public CourseMeetingId(Course course, String day, int period, String location) {
+ this.courseCode = course.getCourseCode();
+ this.day = day;
+ this.period = period;
+ this.location = location;
+ }
+
+ public String getCourseCode() {
+ return courseCode;
+ }
+ public void setCourseCode(String courseCode) {
+ this.courseCode = courseCode;
+ }
+ public String getDay() {
+ return day;
+ }
+ public void setDay(String day) {
+ this.day = day;
+ }
+ public int getPeriod() {
+ return period;
+ }
+ public void setPeriod(int period) {
+ this.period = period;
+ }
+ public String getLocation() {
+ return location;
+ }
+ public void setLocation(String location) {
+ this.location = location;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( o == null || getClass() != o.getClass() ) {
+ return false;
+ }
+
+ CourseMeetingId that = ( CourseMeetingId ) o;
+
+ if ( period != that.period ) {
+ return false;
+ }
+ if ( courseCode != null ? !courseCode.equals( that.courseCode ) : that.courseCode != null ) {
+ return false;
+ }
+ if ( day != null ? !day.equals( that.day ) : that.day != null ) {
+ return false;
+ }
+ if ( location != null ? !location.equals( that.location ) : that.location != null ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result = courseCode != null ? courseCode.hashCode() : 0;
+ result = 31 * result + ( day != null ? day.hashCode() : 0 );
+ result = 31 * result + period;
+ result = 31 * result + ( location != null ? location.hashCode() : 0 );
+ return result;
+ }
+}
\ No newline at end of file
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CriteriaQueryCacheIgnoreResultTransformerTest.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CriteriaQueryCacheIgnoreResultTransformerTest.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CriteriaQueryCacheIgnoreResultTransformerTest.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,57 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ *
+ */
+package org.hibernate.test.querycache;
+
+import junit.framework.Test;
+
+import org.hibernate.CacheMode;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gail Badner
+ */
+public class CriteriaQueryCacheIgnoreResultTransformerTest extends AbstractQueryCacheResultTransformerTest {
+
+ public CriteriaQueryCacheIgnoreResultTransformerTest(String str) {
+ super( str );
+ }
+
+ public static Test suite() {
+ return new FunctionalTestClassTestSuite( CriteriaQueryCacheIgnoreResultTransformerTest.class );
+ }
+
+ protected CacheMode getQueryCacheMode() {
+ return CacheMode.IGNORE;
+ }
+
+ protected void runTest(HqlExecutor hqlExecutor, CriteriaExecutor criteriaExecutor, ResultChecker checker, boolean isSingleResult)
+ throws Exception {
+ createData();
+ if ( criteriaExecutor != null ) {
+ runTest( criteriaExecutor, checker, isSingleResult );
+ }
+ deleteData();
+ }
+}
\ No newline at end of file
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CriteriaQueryCacheNormalResultTransformerTest.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CriteriaQueryCacheNormalResultTransformerTest.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CriteriaQueryCacheNormalResultTransformerTest.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,48 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ *
+ */
+package org.hibernate.test.querycache;
+
+import junit.framework.Test;
+
+import org.hibernate.CacheMode;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gail Badner
+ */
+public class CriteriaQueryCacheNormalResultTransformerTest extends CriteriaQueryCachePutResultTransformerTest {
+
+ public CriteriaQueryCacheNormalResultTransformerTest(String str) {
+ super( str );
+ }
+
+ public static Test suite() {
+ return new FunctionalTestClassTestSuite( CriteriaQueryCacheNormalResultTransformerTest.class );
+ }
+
+ protected CacheMode getQueryCacheMode() {
+ return CacheMode.NORMAL;
+ }
+}
\ No newline at end of file
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CriteriaQueryCachePutResultTransformerTest.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CriteriaQueryCachePutResultTransformerTest.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/CriteriaQueryCachePutResultTransformerTest.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,181 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ *
+ */
+package org.hibernate.test.querycache;
+
+import junit.framework.Test;
+
+import org.hibernate.CacheMode;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gail Badner
+ */
+public class CriteriaQueryCachePutResultTransformerTest extends CriteriaQueryCacheIgnoreResultTransformerTest {
+
+ public CriteriaQueryCachePutResultTransformerTest(String str) {
+ super( str );
+ }
+
+ public static Test suite() {
+ return new FunctionalTestClassTestSuite( CriteriaQueryCachePutResultTransformerTest.class );
+ }
+
+ protected CacheMode getQueryCacheMode() {
+ return CacheMode.PUT;
+ }
+
+ protected boolean areDynamicNonLazyAssociationsChecked() {
+ return false;
+ }
+
+ public void testAliasToEntityMapNoProjectionList() {
+ reportSkip( "Transformers.ALIAS_TO_ENTITY_MAP with Criteria fails when try put in cache",
+ "Cache results using Transformers.ALIAS_TO_ENTITY_MAP with Criteria" );
+ }
+
+ public void testAliasToEntityMapNoProjectionListFailureExpected() throws Exception {
+ super.testAliasToEntityMapNoProjectionList();
+ }
+
+ public void testAliasToEntityMapNoProjectionMultiAndNullList() {
+ reportSkip( "Transformers.ALIAS_TO_ENTITY_MAP with Criteria fails when try put in cache",
+ "Cache results using Transformers.ALIAS_TO_ENTITY_MAP with Criteria" );
+ }
+ public void testAliasToEntityMapNoProjectionMultiAndNullListFailureExpected() throws Exception {
+ super.testAliasToEntityMapNoProjectionMultiAndNullList();
+ }
+
+ public void testAliasToEntityMapOneProjectionList() {
+ reportSkip( "Transformers.ALIAS_TO_ENTITY_MAP with Criteria fails when try put in cache",
+ "Cache results using Transformers.ALIAS_TO_ENTITY_MAP with Criteria" );
+ }
+ public void testAliasToEntityMapOneProjectionListFailureExpected() throws Exception {
+ super.testAliasToEntityMapOneProjectionList();
+ }
+
+ public void testAliasToEntityMapMultiProjectionList() {
+ reportSkip( "Transformers.ALIAS_TO_ENTITY_MAP with Criteria fails when try put in cache",
+ "Cache results using Transformers.ALIAS_TO_ENTITY_MAP with Criteria" );
+ }
+ public void testAliasToEntityMapMultiProjectionListFailureExpected() throws Exception {
+ super.testAliasToEntityMapMultiProjectionList();
+ }
+
+ public void testAliasToEntityMapMultiProjectionWithNullAliasList() {
+ reportSkip( "Transformers.ALIAS_TO_ENTITY_MAP with Criteria fails when try put in cache",
+ "Cache results using Transformers.ALIAS_TO_ENTITY_MAP with Criteria" );
+ }
+ public void testAliasToEntityMapMultiProjectionWithNullAliasListFailureExpected() throws Exception {
+ super.testAliasToEntityMapMultiProjectionWithNullAliasList();
+ }
+
+ public void testAliasToEntityMapMultiAggregatedPropProjectionSingleResult() {
+ reportSkip( "Transformers.ALIAS_TO_ENTITY_MAP with Criteria fails when try put in cache",
+ "Cache results using Transformers.ALIAS_TO_ENTITY_MAP with Criteria" );
+ }
+ public void testAliasToEntityMapMultiAggregatedPropProjectionSingleResultFailureExpected() throws Exception {
+ super.testAliasToEntityMapMultiAggregatedPropProjectionSingleResult();
+ }
+
+ public void testAliasToBeanDtoOneArgList() {
+ reportSkip( "Transformers.aliasToBean with Criteria fails when try put in cache",
+ "Cache results using Transformers.aliasToBean with Criteria" );
+ }
+ public void testAliasToBeanDtoOneArgListFailureExpected() throws Exception {
+ super.testAliasToBeanDtoOneArgList();
+ }
+
+ public void testAliasToBeanDtoMultiArgList() {
+ reportSkip( "Transformers.aliasToBean with Criteria fails when try put in cache",
+ "Cache results using Transformers.aliasToBean with Criteria" );
+ }
+ public void testAliasToBeanDtoMultiArgListFailureExpected() throws Exception {
+ super.testAliasToBeanDtoMultiArgList();
+ }
+
+ public void testAliasToBeanDtoLiteralArgList() {
+ reportSkip( "Transformers.aliasToBean with Criteria fails when try put in cache",
+ "Cache results using Transformers.aliasToBean with Criteria" );
+ }
+ public void testAliasToBeanDtoLiteralArgListFailureExpected() throws Exception {
+ super.testAliasToBeanDtoLiteralArgList();
+ }
+
+ public void testAliasToBeanDtoWithNullAliasList() {
+ reportSkip( "Transformers.aliasToBean with Criteria fails when try put in cache",
+ "Cache results using Transformers.aliasToBean with Criteria" );
+ }
+ public void testAliasToBeanDtoWithNullAliasListFailureExpected() throws Exception {
+ super.testAliasToBeanDtoWithNullAliasList();
+ }
+
+ public void testOneSelectNewList() {
+ reportSkip( "Transformers.aliasToBean with Criteria fails when try put in cache",
+ "Cache results using Transformers.aliasToBean with Criteria" );
+ }
+ public void testOneSelectNewListFailureExpected() throws Exception {
+ super.testOneSelectNewList();
+ }
+
+ public void testMultiSelectNewList() {
+ reportSkip( "Transformers.aliasToBean with Criteria fails when try put in cache",
+ "Cache results using Transformers.aliasToBean with Criteria" );
+ }
+ public void testMultiSelectNewListFailureExpected() throws Exception {
+ super.testMultiSelectNewList();
+ }
+
+ public void testMultiSelectNewWithLiteralList() {
+ reportSkip( "Transformers.aliasToBean with Criteria fails when try put in cache",
+ "Cache results using Transformers.aliasToBean with Criteria" );
+ }
+ public void testMultiSelectNewWithLiteralListFailureExpected() throws Exception {
+ super.testMultiSelectNewWithLiteralList();
+ }
+
+ public void testMultiSelectNewListList() {
+ reportSkip( "Transformers.aliasToBean with Criteria fails when try put in cache",
+ "Cache results using Transformers.aliasToBean with Criteria" );
+ }
+ public void testMultiSelectNewListListFailureExpected() throws Exception {
+ super.testMultiSelectNewListList();
+ }
+
+ public void testMultiSelectNewMapList() {
+ reportSkip( "Transformers.aliasToBean with Criteria fails when try put in cache",
+ "Cache results using Transformers.aliasToBean with Criteria" );
+ }
+ public void testMultiSelectNewMapListFailureExpected() throws Exception {
+ super.testMultiSelectNewMapList();
+ }
+
+ public void testSelectNewEntityConstructorList() {
+ reportSkip( "Transformers.aliasToBean with Criteria fails when try put in cache",
+ "Cache results using Transformers.aliasToBean with Criteria" );
+ }
+ public void testSelectNewEntityConstructorListFailureExpected() throws Exception {
+ super.testMultiSelectNewMapList();
+ }
+}
\ No newline at end of file
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Enrolment.hbm.xml
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Enrolment.hbm.xml (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Enrolment.hbm.xml 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,90 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.querycache">
+
+ <class name="Course">
+ <id name="courseCode">
+ <generator class="assigned"/>
+ </id>
+ <property name="description"/>
+ <set name="courseMeetings" inverse="true" cascade="all-delete-orphan" lazy="false">
+ <key column="courseCode"/>
+ <one-to-many class="CourseMeeting"/>
+ </set>
+ </class>
+
+ <class name="CourseMeeting">
+ <composite-id name="id" class="CourseMeetingId">
+ <key-property name="courseCode"/>
+ <key-property name="day"/>
+ <key-property name="period"/>
+ <key-property name="location"/>
+ </composite-id>
+ <many-to-one name="course" insert="false" update="false" lazy="false">
+ <column name="courseCode"/>
+ </many-to-one>
+ </class>
+
+ <class name="Student">
+ <id name="studentNumber">
+ <column name="studentId"/>
+ <generator class="assigned"/>
+ </id>
+ <component name="name">
+ <property name="first" column="name_first" not-null="true"/>
+ <property name="middle" column="name_middle" not-null="false"/>
+ <property name="last" column="name_last" not-null="true"/>
+ </component>
+ <set name="enrolments" inverse="true" cascade="delete">
+ <key column="studentId"/>
+ <one-to-many class="Enrolment"/>
+ </set>
+ <map name="addresses" table="addresses" cascade="all,delete" lazy="true">
+ <key column="studentNumber"/>
+ <map-key column="addressType" type="string"/>
+ <one-to-many class="Address"/>
+ </map>
+ <many-to-one name="preferredCourse" column="preferredCourseCode" lazy="proxy"/>
+ <list name="secretCodes" lazy="false">
+ <key>
+ <column name="studentNumber"/>
+ </key>
+ <index column="i"/>
+ <element column="secretCode" type="int"/>
+ </list>
+ </class>
+
+ <class name="Address">
+ <id name="id">
+ <generator class="increment"/>
+ </id>
+ <property name="addressType"/>
+ <property name="street"/>
+ <property name="city"/>
+ <property name="stateProvince"/>
+ <property name="postalCode"/>
+ <property name="country"/>
+ <many-to-one name="student" class="Student" column="studentNumber" not-null="false"/>
+ </class>
+
+ <class name="Enrolment">
+ <composite-id>
+ <key-property name="studentNumber">
+ <column name="studentId"/>
+ </key-property>
+ <key-property name="courseCode"/>
+ </composite-id>
+ <many-to-one name="student" insert="false" update="false" lazy="proxy">
+ <column name="studentId"/>
+ </many-to-one>
+ <many-to-one name="course" insert="false" update="false" lazy="false">
+ <column name="courseCode"/>
+ </many-to-one>
+ <property name="semester" type="short" not-null="true"/>
+ <property name="year" column="`year`" type="short" not-null="true"/>
+ </class>
+
+</hibernate-mapping>
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Enrolment.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Enrolment.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Enrolment.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,87 @@
+//$Id: Enrolment.java 6970 2005-05-31 20:24:41Z oneovthafew $
+package org.hibernate.test.querycache;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Enrolment implements Serializable {
+ private Student student;
+ private Course course;
+ private long studentNumber;
+ private String courseCode;
+ private short year;
+ private short semester;
+
+ public String getCourseCode() {
+ return courseCode;
+ }
+ public void setCourseCode(String courseId) {
+ this.courseCode = courseId;
+ }
+ public long getStudentNumber() {
+ return studentNumber;
+ }
+ public void setStudentNumber(long studentId) {
+ this.studentNumber = studentId;
+ }
+ public Course getCourse() {
+ return course;
+ }
+ public void setCourse(Course course) {
+ this.course = course;
+ }
+ public Student getStudent() {
+ return student;
+ }
+ public void setStudent(Student student) {
+ this.student = student;
+ }
+ public short getSemester() {
+ return semester;
+ }
+ public void setSemester(short semester) {
+ this.semester = semester;
+ }
+ public short getYear() {
+ return year;
+ }
+ public void setYear(short year) {
+ this.year = year;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( o == null || getClass() != o.getClass() ) {
+ return false;
+ }
+
+ Enrolment enrolment = ( Enrolment ) o;
+
+ if ( semester != enrolment.semester ) {
+ return false;
+ }
+ if ( studentNumber != enrolment.studentNumber ) {
+ return false;
+ }
+ if ( year != enrolment.year ) {
+ return false;
+ }
+ if ( courseCode != null ? !courseCode.equals( enrolment.courseCode ) : enrolment.courseCode != null ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result = ( int ) ( studentNumber ^ ( studentNumber >>> 32 ) );
+ result = 31 * result + ( courseCode != null ? courseCode.hashCode() : 0 );
+ result = 31 * result + ( int ) year;
+ result = 31 * result + ( int ) semester;
+ return result;
+ }
+}
\ No newline at end of file
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheIgnoreResultTransformerTest.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheIgnoreResultTransformerTest.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheIgnoreResultTransformerTest.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,73 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ *
+ */
+package org.hibernate.test.querycache;
+
+import junit.framework.Test;
+
+import org.hibernate.CacheMode;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gail Badner
+ */
+public class HqlQueryCacheIgnoreResultTransformerTest extends AbstractQueryCacheResultTransformerTest {
+
+ public HqlQueryCacheIgnoreResultTransformerTest(String str) {
+ super( str );
+ }
+
+ public static Test suite() {
+ return new FunctionalTestClassTestSuite( HqlQueryCacheIgnoreResultTransformerTest.class );
+ }
+
+ protected CacheMode getQueryCacheMode() {
+ return CacheMode.IGNORE;
+ }
+
+ protected void runTest(HqlExecutor hqlExecutor, CriteriaExecutor criteriaExecutor, ResultChecker checker, boolean isSingleResult)
+ throws Exception {
+ createData();
+ if ( hqlExecutor != null ) {
+ runTest( hqlExecutor, checker, isSingleResult );
+ }
+ deleteData();
+ }
+
+ public void testAliasToEntityMapNoProjectionList() throws Exception {
+ reportSkip( "known to fail using HQL", "HQL query using Transformers.ALIAS_TO_ENTITY_MAP with no projection" );
+ }
+
+ public void testAliasToEntityMapNoProjectionListFailureExpected() throws Exception {
+ super.testAliasToEntityMapNoProjectionList();
+ }
+
+ public void testAliasToEntityMapNoProjectionMultiAndNullList() throws Exception {
+ reportSkip( "known to fail using HQL", "HQL query using Transformers.ALIAS_TO_ENTITY_MAP with no projection" );
+ }
+
+ public void testAliasToEntityMapNoProjectionMultiAndNullListFailureExpected() throws Exception {
+ super.testAliasToEntityMapNoProjectionMultiAndNullList();
+ }
+}
\ No newline at end of file
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheNormalResultTransformerTest.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheNormalResultTransformerTest.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCacheNormalResultTransformerTest.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,73 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ *
+ */
+package org.hibernate.test.querycache;
+
+import junit.framework.Test;
+
+import org.hibernate.CacheMode;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gail Badner
+ */
+public class HqlQueryCacheNormalResultTransformerTest extends HqlQueryCachePutResultTransformerTest {
+
+ public HqlQueryCacheNormalResultTransformerTest(String str) {
+ super( str );
+ }
+
+ public static Test suite() {
+ return new FunctionalTestClassTestSuite( HqlQueryCacheNormalResultTransformerTest.class );
+ }
+
+ protected CacheMode getQueryCacheMode() {
+ return CacheMode.NORMAL;
+ }
+
+ public void testAliasToBeanDtoMultiArgList() {
+ reportSkip( "Results from queries using Transformers.aliasToBean cannot be found in the cache due to bug in hashCode",
+ "Query using Transformers.aliasToBean with cache"
+ );
+ }
+ public void testAliasToBeanDtoMultiArgListFailureExpected() throws Exception {
+ super.testAliasToBeanDtoMultiArgList();
+ }
+
+ public void testAliasToBeanDtoLiteralArgList() {
+ reportSkip( "Results from queries using Transformers.aliasToBean cannot be found in the cache due to bug in hashCode",
+ "Query using Transformers.aliasToBean with cache" );
+ }
+ public void testAliasToBeanDtoLiteralArgListFailureExpected() throws Exception {
+ super.testAliasToBeanDtoLiteralArgList();
+ }
+
+ public void testAliasToBeanDtoWithNullAliasList() {
+ reportSkip( "Results from queries using Transformers.aliasToBean cannot be found in the cache due to bug in hashCode",
+ "Query using Transformers.aliasToBean with cache" );
+ }
+ public void testAliasToBeanDtoWithNullAliasListFailureExpected() throws Exception {
+ super.testAliasToBeanDtoWithNullAliasList();
+ }
+}
\ No newline at end of file
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCachePutResultTransformerTest.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCachePutResultTransformerTest.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/HqlQueryCachePutResultTransformerTest.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,78 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ *
+ */
+package org.hibernate.test.querycache;
+
+import junit.framework.Test;
+
+import org.hibernate.CacheMode;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gail Badner
+ */
+public class HqlQueryCachePutResultTransformerTest extends HqlQueryCacheIgnoreResultTransformerTest {
+
+ public HqlQueryCachePutResultTransformerTest(String str) {
+ super( str );
+ }
+
+ public static Test suite() {
+ return new FunctionalTestClassTestSuite( HqlQueryCachePutResultTransformerTest.class );
+ }
+
+
+ protected CacheMode getQueryCacheMode() {
+ return CacheMode.PUT;
+ }
+
+ protected boolean areDynamicNonLazyAssociationsChecked() {
+ return false;
+ }
+
+ public void testAliasToEntityMapOneProjectionList() {
+ reportSkip( "HQL queries using a ResultTransformer are known to fail when caching a row with a single value",
+ "HQL queries using a ResultTransformer has row with a single value");
+ }
+ public void testAliasToEntityMapOneProjectionListFailureExpected() throws Exception {
+ super.testAliasToEntityMapOneProjectionList();
+ }
+
+ public void testAliasToBeanDtoOneArgList() {
+ reportSkip( "HQL queries using a ResultTransformer are known to fail when caching a row with a single value",
+ "HQL queries using a ResultTransformer has row with a single value");
+ }
+
+ public void testAliasToBeanDtoOneArgListFailureExpected() throws Exception {
+ super.testAliasToBeanDtoOneArgList();
+ }
+
+ public void testOneSelectNewList() {
+ reportSkip( "HQL queries using a ResultTransformer are known to fail when caching a row with a single value",
+ "HQL queries using a ResultTransformer has row with a single value");
+ }
+ public void testOneSelectNewListFailureExpected() throws Exception {
+ super.testOneSelectNewList();
+ }
+}
\ No newline at end of file
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/PersonName.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/PersonName.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/PersonName.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,96 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ *
+ */
+package org.hibernate.test.querycache;
+
+/**
+ * @author Gail Badner
+ */
+
+public class PersonName {
+ private String first;
+ private String middle;
+ private String last;
+
+ public PersonName() {}
+
+ public PersonName(String first, String middle, String state) {
+ this.first = first;
+ this.middle = middle;
+ this.last = state;
+ }
+
+ public String getFirst() {
+ return first;
+ }
+
+ public void setFirst(String first) {
+ this.first = first;
+ }
+
+ public String getMiddle() {
+ return middle;
+ }
+
+ public void setMiddle(String middle) {
+ this.middle = middle;
+ }
+
+ public String getLast() {
+ return last;
+ }
+
+ public void setLast(String last) {
+ this.last = last;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( o == null || getClass() != o.getClass() ) {
+ return false;
+ }
+
+ PersonName name = ( PersonName ) o;
+
+ if ( first != null ? !first.equals( name.first ) : name.first != null ) {
+ return false;
+ }
+ if ( middle != null ? !middle.equals( name.middle ) : name.middle != null ) {
+ return false;
+ }
+ if ( last != null ? !last.equals( name.last ) : name.last != null ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result = first != null ? first.hashCode() : 0;
+ result = 31 * result + ( last != null ? last.hashCode() : 0 );
+ return result;
+ }
+}
\ No newline at end of file
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Student.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Student.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/Student.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,102 @@
+//$Id: Student.java 9116 2006-01-23 21:21:01Z steveebersole $
+package org.hibernate.test.querycache;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Student {
+ private long studentNumber;
+ private PersonName name;
+ private Course preferredCourse;
+ private Set enrolments = new HashSet();
+ private Map addresses = new HashMap();
+ private List secretCodes = new ArrayList();
+
+ public Student() {}
+
+ public Student(long studentNumber, PersonName name) {
+ this.studentNumber = studentNumber;
+ this.name = name;
+ }
+
+ public PersonName getName() {
+ return name;
+ }
+
+ public void setName(PersonName name) {
+ this.name = name;
+ }
+
+ public long getStudentNumber() {
+ return studentNumber;
+ }
+
+ public void setStudentNumber(long studentNumber) {
+ this.studentNumber = studentNumber;
+ }
+
+ public Map getAddresses() {
+ return addresses;
+ }
+
+ public void setAddresses(Map addresses) {
+ this.addresses = addresses;
+ }
+
+ public Course getPreferredCourse() {
+ return preferredCourse;
+ }
+
+ public void setPreferredCourse(Course preferredCourse) {
+ this.preferredCourse = preferredCourse;
+ }
+
+ public Set getEnrolments() {
+ return enrolments;
+ }
+
+ public void setEnrolments(Set employments) {
+ this.enrolments = employments;
+ }
+
+ public List getSecretCodes() {
+ return secretCodes;
+ }
+
+ public void setSecretCodes(List secretCodes) {
+ this.secretCodes = secretCodes;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( o == null || ! ( o instanceof Student ) ) {
+ return false;
+ }
+
+ Student student = ( Student ) o;
+
+ if ( studentNumber != student.getStudentNumber() ) {
+ return false;
+ }
+ if ( name != null ? !name.equals( student.getName() ) : student.getName() != null ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result = ( int ) ( studentNumber ^ ( studentNumber >>> 32 ) );
+ result = 31 * result + ( name != null ? name.hashCode() : 0 );
+ return result;
+ }
+}
\ No newline at end of file
Added: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/StudentDTO.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/StudentDTO.java (rev 0)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/querycache/StudentDTO.java 2010-07-29 21:29:48 UTC (rev 20077)
@@ -0,0 +1,60 @@
+/*
+ * Created on 28-Jan-2005
+ *
+ */
+package org.hibernate.test.querycache;
+
+/**
+ * @author max
+ *
+ */
+public class StudentDTO {
+
+ private PersonName studentName;
+ private String courseDescription;
+
+ public StudentDTO() { }
+
+ public StudentDTO(PersonName name) {
+ this.studentName = name;
+ }
+
+ public StudentDTO(PersonName name, String description) {
+ this.studentName = name;
+ this.courseDescription = description;
+ }
+
+ public PersonName getName() {
+ return studentName;
+ }
+
+ public String getDescription() {
+ return courseDescription;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( o == null || getClass() != o.getClass() ) {
+ return false;
+ }
+
+ StudentDTO that = ( StudentDTO ) o;
+
+ if ( courseDescription != null ? !courseDescription.equals( that.courseDescription ) : that.courseDescription != null ) {
+ return false;
+ }
+ if ( studentName != null ? !studentName.equals( that.studentName ) : that.studentName != null ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result = studentName != null ? studentName.hashCode() : 0;
+ result = 31 * result + ( courseDescription != null ? courseDescription.hashCode() : 0 );
+ return result;
+ }
+}
\ No newline at end of file
13 years, 7 months
Hibernate SVN: r20076 - core/trunk/documentation/manual/src/main/docbook/en-US/content.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-07-29 13:31:57 -0400 (Thu, 29 Jul 2010)
New Revision: 20076
Modified:
core/trunk/documentation/manual/src/main/docbook/en-US/content/configuration.xml
Log:
Rename 'JBoss' to 'JBoss AS'
Modified: core/trunk/documentation/manual/src/main/docbook/en-US/content/configuration.xml
===================================================================
--- core/trunk/documentation/manual/src/main/docbook/en-US/content/configuration.xml 2010-07-29 17:31:28 UTC (rev 20075)
+++ core/trunk/documentation/manual/src/main/docbook/en-US/content/configuration.xml 2010-07-29 17:31:57 UTC (rev 20076)
@@ -1514,7 +1514,7 @@
<row>
<entry><literal>org.hibernate.transaction.JBossTransactionManagerLookup</literal></entry>
- <entry align="center">JBoss</entry>
+ <entry align="center">JBoss AS</entry>
</row>
<row>
13 years, 7 months
Hibernate SVN: r20075 - in core/trunk: documentation/manual/src/main/docbook/en-US/content and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-07-29 13:31:28 -0400 (Thu, 29 Jul 2010)
New Revision: 20075
Added:
core/trunk/core/src/main/java/org/hibernate/transaction/JBossTSStandaloneTransactionManagerLookup.java
Modified:
core/trunk/documentation/manual/src/main/docbook/en-US/content/configuration.xml
Log:
HHH-5423 Provide a JBoss TS TransactionManagerLookup implementation for standalone (non JNDI) usage
Added: core/trunk/core/src/main/java/org/hibernate/transaction/JBossTSStandaloneTransactionManagerLookup.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/transaction/JBossTSStandaloneTransactionManagerLookup.java (rev 0)
+++ core/trunk/core/src/main/java/org/hibernate/transaction/JBossTSStandaloneTransactionManagerLookup.java 2010-07-29 17:31:28 UTC (rev 20075)
@@ -0,0 +1,66 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ *
+ */
+package org.hibernate.transaction;
+
+import java.lang.reflect.Method;
+import java.util.Properties;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+
+import org.hibernate.HibernateException;
+
+/**
+ * Return a standalone JTA transaction manager for JBoss Transactions
+ * Known to work for org.jboss.jbossts:jbossjta:4.11.0.Final
+ *
+ * @author Emmanuel Bernard
+ */
+public class JBossTSStandaloneTransactionManagerLookup implements TransactionManagerLookup {
+
+ public TransactionManager getTransactionManager(Properties props) throws HibernateException {
+ try {
+ //Call jtaPropertyManager.getJTAEnvironmentBean().getTransactionManager();
+
+ //improper camel case name for the class
+ Class<?> propertyManager = Class.forName( "com.arjuna.ats.jta.common.jtaPropertyManager" );
+ final Method getJTAEnvironmentBean = propertyManager.getMethod( "getJTAEnvironmentBean" );
+ //static method
+ final Object jtaEnvironmentBean = getJTAEnvironmentBean.invoke( null );
+ final Method getTransactionManager = jtaEnvironmentBean.getClass().getMethod( "getTransactionManager" );
+ return ( TransactionManager ) getTransactionManager.invoke( jtaEnvironmentBean );
+ }
+ catch ( Exception e ) {
+ throw new HibernateException( "Could not obtain JBoss Transactions transaction manager instance", e );
+ }
+ }
+
+ public String getUserTransactionName() {
+ return null;
+ }
+
+ public Object getTransactionIdentifier(Transaction transaction) {
+ return transaction;
+ }
+}
Modified: core/trunk/documentation/manual/src/main/docbook/en-US/content/configuration.xml
===================================================================
--- core/trunk/documentation/manual/src/main/docbook/en-US/content/configuration.xml 2010-07-28 18:55:13 UTC (rev 20074)
+++ core/trunk/documentation/manual/src/main/docbook/en-US/content/configuration.xml 2010-07-29 17:31:28 UTC (rev 20075)
@@ -1570,6 +1570,13 @@
<entry align="center">Borland ES</entry>
</row>
+
+ <row>
+ <entry><literal>org.hibernate.transaction.JBossTSStandaloneTransactionManagerLookup</literal></entry>
+
+ <entry align="center">JBoss TS used standalone (ie. outside JBoss AS and a JNDI environment generally).
+ Known to work for <literal>org.jboss.jbossts:jbossjta:4.11.0.Final</literal></entry>
+ </row>
</tbody>
</tgroup>
</table>
13 years, 7 months