Merge remote-tracking branch 'upstream/wip/6.0' into wip/6.0
This commit is contained in:
commit
3eee006002
|
@ -270,89 +270,117 @@ public abstract class Dialect implements ConversionContext {
|
||||||
* These required functions include the functions defined by the JPA
|
* These required functions include the functions defined by the JPA
|
||||||
* query language specification:
|
* query language specification:
|
||||||
*
|
*
|
||||||
* * avg(arg) - aggregate function
|
* <ul>
|
||||||
* * count([distinct ]arg) - aggregate function
|
* <li> avg(arg) - aggregate function
|
||||||
* * max(arg) - aggregate function
|
* <li> count([distinct ]arg) - aggregate function
|
||||||
* * min(arg) - aggregate function
|
* <li> max(arg) - aggregate function
|
||||||
* * sum(arg) - aggregate function
|
* <li> min(arg) - aggregate function
|
||||||
|
* <li> sum(arg) - aggregate function
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* * coalesce(arg0, arg1, ...)
|
* <ul>
|
||||||
* * nullif(arg0, arg1)
|
* <li> coalesce(arg0, arg1, ...)
|
||||||
|
* <li> nullif(arg0, arg1)
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* * lower(arg)
|
* <ul>
|
||||||
* * upper(arg)
|
* <li> lower(arg)
|
||||||
* * length(arg)
|
* <li> upper(arg)
|
||||||
* * concat(arg0, arg1, ...)
|
* <li> length(arg)
|
||||||
* * locate(pattern, string[, start])
|
* <li> concat(arg0, arg1, ...)
|
||||||
* * substring(string, start[, length])
|
* <li> locate(pattern, string[, start])
|
||||||
* * trim([[spec ][character ]from] string)
|
* <li> substring(string, start[, length])
|
||||||
|
* <li> trim([[spec ][character ]from] string)
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* * abs(arg)
|
* <ul>
|
||||||
* * mod(arg0, arg1)
|
* <li> abs(arg)
|
||||||
* * sqrt(arg)
|
* <li> mod(arg0, arg1)
|
||||||
|
* <li> sqrt(arg)
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* * current date
|
* <ul>
|
||||||
* * current time
|
* <li> current date
|
||||||
* * current timestamp
|
* <li> current time
|
||||||
|
* <li> current timestamp
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* Along with an additional set of functions defined by ANSI SQL:
|
* Along with an additional set of functions defined by ANSI SQL:
|
||||||
*
|
*
|
||||||
* * any(arg) - aggregate function
|
* <ul>
|
||||||
* * every(arg) - aggregate function
|
* <li> any(arg) - aggregate function
|
||||||
|
* <li> every(arg) - aggregate function
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* * cast(arg as Type)
|
* <ul>
|
||||||
* * extract(field from arg)
|
* <li> cast(arg as Type)
|
||||||
|
* <li> extract(field from arg)
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* * ln(arg)
|
* <ul>
|
||||||
* * exp(arg)
|
* <li> ln(arg)
|
||||||
* * power(arg0, arg1)
|
* <li> exp(arg)
|
||||||
* * floor(arg)
|
* <li> power(arg0, arg1)
|
||||||
* * ceiling(arg)
|
* <li> floor(arg)
|
||||||
|
* <li> ceiling(arg)
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* * position(pattern in string)
|
* <ul>
|
||||||
* * substring(string from start[ for length])
|
* <li> position(pattern in string)
|
||||||
* * overlay(string placing replacement from start[ for length])
|
* <li> substring(string from start[ for length])
|
||||||
|
* <li> overlay(string placing replacement from start[ for length])
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* And the following functions for working with java.time types:
|
* And the following functions for working with java.time types:
|
||||||
*
|
*
|
||||||
* * local date
|
* <ul>
|
||||||
* * local time
|
* <li> local date
|
||||||
* * local datetime
|
* <li> local time
|
||||||
* * offset datetime
|
* <li> local datetime
|
||||||
* * instant
|
* <li> offset datetime
|
||||||
|
* <li> instant
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* And a number of additional "standard" functions:
|
* And a number of additional "standard" functions:
|
||||||
*
|
*
|
||||||
* * left(string, length)
|
* <ul>
|
||||||
* * right(string, length)
|
* <li> left(string, length)
|
||||||
* * replace(string, pattern, replacement)
|
* <li> right(string, length)
|
||||||
* * pad(string with length spec[ character])
|
* <li> replace(string, pattern, replacement)
|
||||||
|
* <li> pad(string with length spec[ character])
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* * sign(arg)
|
* <ul>
|
||||||
* * sin(arg)
|
* <li> sign(arg)
|
||||||
* * cos(arg)
|
* <li> sin(arg)
|
||||||
* * tan(arg)
|
* <li> cos(arg)
|
||||||
* * asin(arg)
|
* <li> tan(arg)
|
||||||
* * acos(arg)
|
* <li> asin(arg)
|
||||||
* * atan(arg)
|
* <li> acos(arg)
|
||||||
* * atan2(arg0, arg1)
|
* <li> atan(arg)
|
||||||
* * round(arg0, arg1)
|
* <li> atan2(arg0, arg1)
|
||||||
* * least(arg0, arg1, ...)
|
* <li> round(arg0, arg1)
|
||||||
* * greatest(arg0, arg1, ...)
|
* <li> least(arg0, arg1, ...)
|
||||||
|
* <li> greatest(arg0, arg1, ...)
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* * format(datetime as pattern)
|
* <ul>
|
||||||
* * str(arg) - synonym of cast(a as String)
|
* <li> format(datetime as pattern)
|
||||||
* * ifnull(arg0, arg1) - synonym of coalesce(a, b)
|
* <li> str(arg) - synonym of cast(a as String)
|
||||||
|
* <li> ifnull(arg0, arg1) - synonym of coalesce(a, b)
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* Finally, the following functions are defined as abbreviations
|
* Finally, the following functions are defined as abbreviations
|
||||||
* for extract(), and desugared by the parser:
|
* for extract(), and desugared by the parser:
|
||||||
*
|
*
|
||||||
* * second(arg) - synonym of extract(second from a)
|
* <ul>
|
||||||
* * minute(arg) - synonym of extract(minute from a)
|
* <li> second(arg) - synonym of extract(second from a)
|
||||||
* * hour(arg) - synonym of extract(hour from a)
|
* <li> minute(arg) - synonym of extract(minute from a)
|
||||||
* * day(arg) - synonym of extract(day from a)
|
* <li> hour(arg) - synonym of extract(hour from a)
|
||||||
* * month(arg) - synonym of extract(month from a)
|
* <li> day(arg) - synonym of extract(day from a)
|
||||||
* * year(arg) - synonym of extract(year from a)
|
* <li> month(arg) - synonym of extract(month from a)
|
||||||
|
* <li> year(arg) - synonym of extract(year from a)
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public void initializeFunctionRegistry(QueryEngine queryEngine) {
|
public void initializeFunctionRegistry(QueryEngine queryEngine) {
|
||||||
|
@ -497,26 +525,76 @@ public abstract class Dialect implements ConversionContext {
|
||||||
queryEngine.getSqmFunctionRegistry().registerAlternateKey( "current_instant", "instant" ); //deprecated legacy!
|
queryEngine.getSqmFunctionRegistry().registerAlternateKey( "current_instant", "instant" ); //deprecated legacy!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translation of the HQL/JPQL {@code current_date} function, which
|
||||||
|
* maps to the Java type {@code java.sql.Date}, and of the HQL
|
||||||
|
* {@code local_date} function which maps to the Java type
|
||||||
|
* {@code java.sql.LocalDate}.
|
||||||
|
*/
|
||||||
public String currentDate() {
|
public String currentDate() {
|
||||||
return "current_date";
|
return "current_date";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translation of the HQL/JPQL {@code current_time} function, which
|
||||||
|
* maps to the Java type {@code java.sql.Time} which is a time with
|
||||||
|
* no time zone. This contradicts ANSI SQL where {@code current_time}
|
||||||
|
* has the type {@code TIME WITH TIME ZONE}.
|
||||||
|
* <p>
|
||||||
|
* It is recommended to override this in dialects for databases which
|
||||||
|
* support {@code localtime} or {@code time at local}.
|
||||||
|
*/
|
||||||
public String currentTime() {
|
public String currentTime() {
|
||||||
return "current_time";
|
return "current_time";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translation of the HQL/JPQL {@code current_timestamp} function,
|
||||||
|
* which maps to the Java type {@code java.sql.Timestamp} which is
|
||||||
|
* a datetime with no time zone. This contradicts ANSI SQL where
|
||||||
|
* {@code current_timestamp} has the type
|
||||||
|
* {@code TIMESTAMP WITH TIME ZONE}.
|
||||||
|
* <p>
|
||||||
|
* It is recommended to override this in dialects for databases which
|
||||||
|
* support {@code localtimestamp} or {@code timestamp at local}.
|
||||||
|
*/
|
||||||
public String currentTimestamp() {
|
public String currentTimestamp() {
|
||||||
return "current_timestamp";
|
return "current_timestamp";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translation of the HQL {@code local_time} function, which maps to
|
||||||
|
* the Java type {@code java.time.LocalTime} which is a time with no
|
||||||
|
* time zone. It should usually be the same SQL function as for
|
||||||
|
* {@link #currentTime()}.
|
||||||
|
* <p>
|
||||||
|
* It is recommended to override this in dialects for databases which
|
||||||
|
* support {@code localtime} or {@code current_time at local}.
|
||||||
|
*/
|
||||||
public String currentLocalTime() {
|
public String currentLocalTime() {
|
||||||
return currentTime();
|
return currentTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translation of the HQL {@code local_datetime} function, which maps
|
||||||
|
* to the Java type {@code java.time.LocalDateTime} which is a datetime
|
||||||
|
* with no time zone. It should usually be the same SQL function as for
|
||||||
|
* {@link #currentTimestamp()}.
|
||||||
|
* <p>
|
||||||
|
* It is recommended to override this in dialects for databases which
|
||||||
|
* support {@code localtimestamp} or {@code current_timestamp at local}.
|
||||||
|
*/
|
||||||
public String currentLocalTimestamp() {
|
public String currentLocalTimestamp() {
|
||||||
return currentTimestamp();
|
return currentTimestamp();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translation of the HQL {@code offset_datetime} function, which maps
|
||||||
|
* to the Java type {@code java.time.OffsetDateTime} which is a datetime
|
||||||
|
* with a time zone. This in principle correctly maps to the ANSI SQL
|
||||||
|
* {@code current_timestamp} which has the type
|
||||||
|
* {@code TIMESTAMP WITH TIME ZONE}.
|
||||||
|
*/
|
||||||
public String currentTimestampWithTimeZone() {
|
public String currentTimestampWithTimeZone() {
|
||||||
return currentTimestamp();
|
return currentTimestamp();
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,7 @@ public class H2Dialect extends Dialect {
|
||||||
private final LimitHandler limitHandler;
|
private final LimitHandler limitHandler;
|
||||||
|
|
||||||
private final boolean cascadeConstraints;
|
private final boolean cascadeConstraints;
|
||||||
|
private final boolean useLocalTime;
|
||||||
|
|
||||||
private final int version;
|
private final int version;
|
||||||
|
|
||||||
|
@ -101,6 +102,8 @@ public class H2Dialect extends Dialect {
|
||||||
supportsTuplesInSubqueries = version >= 104198;
|
supportsTuplesInSubqueries = version >= 104198;
|
||||||
// Prior to 1.4.200 the 'cascade' in 'drop table' was implicit
|
// Prior to 1.4.200 the 'cascade' in 'drop table' was implicit
|
||||||
cascadeConstraints = version >= 104200;
|
cascadeConstraints = version >= 104200;
|
||||||
|
// 1.4.200 introduced changes in current_time and current_timestamp
|
||||||
|
useLocalTime = version >= 140199;
|
||||||
|
|
||||||
getDefaultProperties().setProperty( AvailableSettings.STATEMENT_BATCH_SIZE, DEFAULT_BATCH_SIZE );
|
getDefaultProperties().setProperty( AvailableSettings.STATEMENT_BATCH_SIZE, DEFAULT_BATCH_SIZE );
|
||||||
// http://code.google.com/p/h2database/issues/detail?id=235
|
// http://code.google.com/p/h2database/issues/detail?id=235
|
||||||
|
@ -117,6 +120,12 @@ public class H2Dialect extends Dialect {
|
||||||
this.sequenceInformationExtractor = SequenceInformationExtractorNoOpImpl.INSTANCE;
|
this.sequenceInformationExtractor = SequenceInformationExtractorNoOpImpl.INSTANCE;
|
||||||
this.querySequenceString = null;
|
this.querySequenceString = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( version < 200 ) {
|
||||||
|
// prior to version 2.0, H2 reported NUMERIC columns as DECIMAL,
|
||||||
|
// which caused problems for schema update tool
|
||||||
|
registerColumnType( Types.NUMERIC, "decimal($p,$s)" );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int parseBuildId(DialectResolutionInfo info) {
|
private static int parseBuildId(DialectResolutionInfo info) {
|
||||||
|
@ -185,6 +194,21 @@ public class H2Dialect extends Dialect {
|
||||||
CommonFunctionFactory.rownum( queryEngine );
|
CommonFunctionFactory.rownum( queryEngine );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String currentTime() {
|
||||||
|
return useLocalTime ? "localtime" : super.currentTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String currentTimestamp() {
|
||||||
|
return useLocalTime ? "localtimestamp" : super.currentTimestamp();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String currentTimestampWithTimeZone() {
|
||||||
|
return "current_timestamp";
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
|
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
|
||||||
return new StandardSqlAstTranslatorFactory() {
|
return new StandardSqlAstTranslatorFactory() {
|
||||||
|
|
|
@ -212,6 +212,21 @@ public class HSQLDialect extends Dialect {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String currentTime() {
|
||||||
|
return "localtime";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String currentTimestamp() {
|
||||||
|
return "localtimestamp";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String currentTimestampWithTimeZone() {
|
||||||
|
return "current_timestamp";
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
|
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
|
||||||
return new StandardSqlAstTranslatorFactory() {
|
return new StandardSqlAstTranslatorFactory() {
|
||||||
|
|
|
@ -122,6 +122,21 @@ public class PostgreSQLDialect extends Dialect {
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String currentTime() {
|
||||||
|
return "localtime";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String currentTimestamp() {
|
||||||
|
return "localtimestamp";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String currentTimestampWithTimeZone() {
|
||||||
|
return "current_timestamp";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@code extract()} function returns {@link TemporalUnit#DAY_OF_WEEK}
|
* The {@code extract()} function returns {@link TemporalUnit#DAY_OF_WEEK}
|
||||||
* numbered from 0 to 6. This isn't consistent with what most other
|
* numbered from 0 to 6. This isn't consistent with what most other
|
||||||
|
|
|
@ -8,6 +8,7 @@ package org.hibernate.type;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
import org.hibernate.type.descriptor.java.UUIDTypeDescriptor;
|
import org.hibernate.type.descriptor.java.UUIDTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.sql.BinaryTypeDescriptor;
|
import org.hibernate.type.descriptor.sql.BinaryTypeDescriptor;
|
||||||
|
|
||||||
|
@ -20,7 +21,12 @@ public class UUIDBinaryType extends AbstractSingleColumnStandardBasicType<UUID>
|
||||||
public static final UUIDBinaryType INSTANCE = new UUIDBinaryType();
|
public static final UUIDBinaryType INSTANCE = new UUIDBinaryType();
|
||||||
|
|
||||||
public UUIDBinaryType() {
|
public UUIDBinaryType() {
|
||||||
super( BinaryTypeDescriptor.INSTANCE, UUIDTypeDescriptor.INSTANCE );
|
super( BinaryTypeDescriptor.INSTANCE, new UUIDTypeDescriptor() {
|
||||||
|
@Override
|
||||||
|
public long getDefaultSqlLength(Dialect dialect) {
|
||||||
|
return 16;
|
||||||
|
}
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
|
|
|
@ -21,7 +21,12 @@ public class UUIDCharType extends AbstractSingleColumnStandardBasicType<UUID> im
|
||||||
public static final UUIDCharType INSTANCE = new UUIDCharType();
|
public static final UUIDCharType INSTANCE = new UUIDCharType();
|
||||||
|
|
||||||
public UUIDCharType() {
|
public UUIDCharType() {
|
||||||
super( VarcharTypeDescriptor.INSTANCE, UUIDTypeDescriptor.INSTANCE );
|
super( VarcharTypeDescriptor.INSTANCE, new UUIDTypeDescriptor() {
|
||||||
|
@Override
|
||||||
|
public long getDefaultSqlLength(Dialect dialect) {
|
||||||
|
return 36;
|
||||||
|
}
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
|
|
|
@ -1,117 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
//$Id$
|
|
||||||
|
|
||||||
package org.hibernate.jpa.test.connection;
|
|
||||||
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
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;
|
|
||||||
|
|
||||||
import org.hibernate.cfg.Environment;
|
|
||||||
import org.hibernate.jpa.HibernatePersistenceProvider;
|
|
||||||
import org.hibernate.jpa.test.Distributor;
|
|
||||||
import org.hibernate.jpa.test.Item;
|
|
||||||
import org.hibernate.jpa.test.xml.Light;
|
|
||||||
import org.hibernate.jpa.test.xml.Lighter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
public class PersistenceUnitInfoImpl implements PersistenceUnitInfo {
|
|
||||||
private Properties properties = new Properties();
|
|
||||||
private List<String> mappingFiles;
|
|
||||||
private URL puRoot;
|
|
||||||
|
|
||||||
public PersistenceUnitInfoImpl(URL puRoot, String[] mappingFiles) {
|
|
||||||
this.mappingFiles = new ArrayList<>( mappingFiles.length );
|
|
||||||
this.mappingFiles.addAll( Arrays.asList( mappingFiles ) );
|
|
||||||
this.puRoot = puRoot;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPersistenceUnitName() {
|
|
||||||
return "persistenceinfo";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPersistenceProviderClassName() {
|
|
||||||
return HibernatePersistenceProvider.class.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
public DataSource getJtaDataSource() {
|
|
||||||
return new FakeDataSource();
|
|
||||||
}
|
|
||||||
|
|
||||||
public DataSource getNonJtaDataSource() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> getMappingFileNames() {
|
|
||||||
return mappingFiles;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<URL> getJarFileUrls() {
|
|
||||||
return new ArrayList<URL>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> getManagedClassNames() {
|
|
||||||
List<String> classes = new ArrayList<String>();
|
|
||||||
classes.add( Item.class.getName() );
|
|
||||||
classes.add( Distributor.class.getName() );
|
|
||||||
classes.add( Light.class.getName() );
|
|
||||||
classes.add( Lighter.class.getName() );
|
|
||||||
return classes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Properties getProperties() {
|
|
||||||
properties.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
|
|
||||||
return properties;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPersistenceXMLSchemaVersion() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ClassLoader getClassLoader() {
|
|
||||||
return Thread.currentThread().getContextClassLoader();
|
|
||||||
}
|
|
||||||
|
|
||||||
public PersistenceUnitTransactionType getTransactionType() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public URL getPersistenceUnitRootUrl() {
|
|
||||||
return puRoot;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean excludeUnlistedClasses() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SharedCacheMode getSharedCacheMode() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ValidationMode getValidationMode() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addTransformer(ClassTransformer transformer) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public ClassLoader getNewTempClassLoader() {
|
|
||||||
return Thread.currentThread().getContextClassLoader();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,104 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.connection;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Properties;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.PersistenceException;
|
|
||||||
import javax.persistence.criteria.CriteriaBuilder;
|
|
||||||
import javax.persistence.criteria.CriteriaQuery;
|
|
||||||
|
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
|
||||||
import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl;
|
|
||||||
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
|
|
||||||
import org.hibernate.exception.SQLGrammarException;
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Andrea Boriero
|
|
||||||
*/
|
|
||||||
@TestForIssue(jiraKey = "HHH-11257")
|
|
||||||
public class TestConnectionPool
|
|
||||||
extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
|
|
||||||
private final static int CONNECTION_POOL_SIZE = 2;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[] { TestEntity.class };
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean createSchema() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void addConfigOptions(Map options) {
|
|
||||||
options.put(
|
|
||||||
AvailableSettings.POOL_SIZE,
|
|
||||||
Integer.valueOf( CONNECTION_POOL_SIZE )
|
|
||||||
);
|
|
||||||
options.put( "hibernate.connection.customProperty", "x" );
|
|
||||||
options.put( AvailableSettings.CONNECTION_PROVIDER_DISABLES_AUTOCOMMIT, "true" );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@TestForIssue(jiraKey = "HHH-13700")
|
|
||||||
public void testConnectionPoolPropertyFiltering() {
|
|
||||||
ConnectionProvider cp = serviceRegistry().getService( ConnectionProvider.class );
|
|
||||||
DriverManagerConnectionProviderImpl dmcp = (DriverManagerConnectionProviderImpl) cp;
|
|
||||||
Properties connectionProperties = dmcp.getConnectionProperties();
|
|
||||||
Assert.assertEquals( "x", connectionProperties.getProperty( "customProperty" ) );
|
|
||||||
Assert.assertNull( connectionProperties.getProperty( "pool_size" ) );
|
|
||||||
Assert.assertNull( connectionProperties.getProperty( "provider_disables_autocommit" ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testConnectionPoolDoesNotConsumeAllConnections() {
|
|
||||||
for ( int i = 0; i < CONNECTION_POOL_SIZE + 1; ++i ) {
|
|
||||||
EntityManager entityManager = getOrCreateEntityManager();
|
|
||||||
try {
|
|
||||||
for ( int j = 0; j < 2; j++ ) {
|
|
||||||
try {
|
|
||||||
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
|
|
||||||
final CriteriaQuery<TestEntity> criteriaQuery = builder.createQuery(
|
|
||||||
TestEntity.class );
|
|
||||||
criteriaQuery.select( criteriaQuery.from( TestEntity.class ) );
|
|
||||||
|
|
||||||
entityManager.createQuery( criteriaQuery ).getResultList();
|
|
||||||
}
|
|
||||||
catch ( PersistenceException e ) {
|
|
||||||
if ( e.getCause() instanceof SQLGrammarException ) {
|
|
||||||
//expected, the schema was not created
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
entityManager.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Entity(name = "Test_Entity")
|
|
||||||
public static class TestEntity {
|
|
||||||
|
|
||||||
@Id
|
|
||||||
public long id;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.criteria;
|
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.criteria.CollectionJoin;
|
|
||||||
import javax.persistence.criteria.CriteriaQuery;
|
|
||||||
import javax.persistence.criteria.Root;
|
|
||||||
|
|
||||||
import org.hibernate.jpa.test.metamodel.AbstractMetamodelSpecificTest;
|
|
||||||
import org.hibernate.jpa.test.metamodel.LineItem;
|
|
||||||
import org.hibernate.jpa.test.metamodel.LineItem_;
|
|
||||||
import org.hibernate.jpa.test.metamodel.Order;
|
|
||||||
import org.hibernate.jpa.test.metamodel.Order_;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Similar to {@link org.hibernate.orm.test.query.hql.OnKeywordTest}, but here testing from JPA criteria queries.
|
|
||||||
*
|
|
||||||
* @author Steve Ebersole
|
|
||||||
*/
|
|
||||||
public class OnKeywordTest extends AbstractMetamodelSpecificTest {
|
|
||||||
@Test
|
|
||||||
public void basicTest() {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
CriteriaQuery<Order> criteria = em.getCriteriaBuilder().createQuery( Order.class );
|
|
||||||
Root<Order> root = criteria.from( Order.class );
|
|
||||||
criteria.select( root );
|
|
||||||
CollectionJoin<Order,LineItem> lineItemsJoin = root.join( Order_.lineItems );
|
|
||||||
lineItemsJoin.on(
|
|
||||||
em.getCriteriaBuilder().gt(
|
|
||||||
lineItemsJoin.get( LineItem_.quantity ),
|
|
||||||
em.getCriteriaBuilder().literal( 20 )
|
|
||||||
)
|
|
||||||
);
|
|
||||||
em.createQuery( criteria ).getResultList();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,65 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.criteria.basic;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.math.BigInteger;
|
|
||||||
import java.util.List;
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.criteria.CriteriaBuilder;
|
|
||||||
import javax.persistence.criteria.CriteriaQuery;
|
|
||||||
import javax.persistence.criteria.Root;
|
|
||||||
|
|
||||||
import org.hibernate.dialect.DerbyDialect;
|
|
||||||
import org.hibernate.jpa.test.metamodel.AbstractMetamodelSpecificTest;
|
|
||||||
import org.hibernate.jpa.test.metamodel.Product;
|
|
||||||
import org.hibernate.jpa.test.metamodel.Product_;
|
|
||||||
|
|
||||||
import org.hibernate.testing.SkipForDialect;
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
public class CastTest extends AbstractMetamodelSpecificTest {
|
|
||||||
private static final int QUANTITY = 2;
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@SkipForDialect(value = DerbyDialect.class,comment = "Derby does not support cast from INTEGER to VARCHAR")
|
|
||||||
@TestForIssue( jiraKey = "HHH-5755" )
|
|
||||||
public void testCastToString() {
|
|
||||||
EntityManager em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
Product product = new Product();
|
|
||||||
product.setId( "product1" );
|
|
||||||
product.setPrice( 1.23d );
|
|
||||||
product.setQuantity( QUANTITY );
|
|
||||||
product.setPartNumber( ((long)Integer.MAX_VALUE) + 1 );
|
|
||||||
product.setRating( 1.999f );
|
|
||||||
product.setSomeBigInteger( BigInteger.valueOf( 987654321 ) );
|
|
||||||
product.setSomeBigDecimal( BigDecimal.valueOf( 987654.321 ) );
|
|
||||||
em.persist( product );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
CriteriaBuilder builder = em.getCriteriaBuilder();
|
|
||||||
CriteriaQuery<Product> criteria = builder.createQuery( Product.class );
|
|
||||||
Root<Product> root = criteria.from( Product.class );
|
|
||||||
criteria.where( builder.equal(root.get(Product_.quantity).as( String.class ), builder.literal(String.valueOf(QUANTITY))) );
|
|
||||||
List<Product> result = em.createQuery( criteria ).getResultList();
|
|
||||||
Assert.assertEquals( 1, result.size() );
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
|
|
||||||
em = getOrCreateEntityManager();
|
|
||||||
em.getTransaction().begin();
|
|
||||||
em.createQuery( "delete Product" ).executeUpdate();
|
|
||||||
em.getTransaction().commit();
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,135 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.jpa.test.ejb3configuration;
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.ObjectInputStream;
|
|
||||||
import java.io.ObjectOutput;
|
|
||||||
import java.io.ObjectOutputStream;
|
|
||||||
import java.util.Date;
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.EntityManagerFactory;
|
|
||||||
|
|
||||||
import org.hibernate.Session;
|
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
|
||||||
import org.hibernate.jpa.HibernateEntityManager;
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
import org.hibernate.jpa.test.Cat;
|
|
||||||
import org.hibernate.jpa.test.Distributor;
|
|
||||||
import org.hibernate.jpa.test.Item;
|
|
||||||
import org.hibernate.jpa.test.Kitten;
|
|
||||||
import org.hibernate.jpa.test.Wallet;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
public class EntityManagerFactorySerializationTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
@Test
|
|
||||||
public void testSerialization() throws Exception {
|
|
||||||
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
|
||||||
ObjectOutput out = new ObjectOutputStream( stream );
|
|
||||||
out.writeObject( entityManagerFactory() );
|
|
||||||
out.close();
|
|
||||||
byte[] serialized = stream.toByteArray();
|
|
||||||
stream.close();
|
|
||||||
ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
|
|
||||||
ObjectInputStream in = new ObjectInputStream( byteIn );
|
|
||||||
EntityManagerFactory serializedFactory = (EntityManagerFactory) in.readObject();
|
|
||||||
in.close();
|
|
||||||
byteIn.close();
|
|
||||||
EntityManager em = serializedFactory.createEntityManager();
|
|
||||||
//em.getTransaction().begin();
|
|
||||||
//em.setFlushMode( FlushModeType.NEVER );
|
|
||||||
Cat cat = new Cat();
|
|
||||||
cat.setAge( 3 );
|
|
||||||
cat.setDateOfBirth( new Date() );
|
|
||||||
cat.setLength( 22 );
|
|
||||||
cat.setName( "Kitty" );
|
|
||||||
em.persist( cat );
|
|
||||||
Item item = new Item();
|
|
||||||
item.setName( "Train Ticket" );
|
|
||||||
item.setDescr( "Paris-London" );
|
|
||||||
em.persist( item );
|
|
||||||
//em.getTransaction().commit();
|
|
||||||
//em.getTransaction().begin();
|
|
||||||
item.setDescr( "Paris-Bruxelles" );
|
|
||||||
//em.getTransaction().commit();
|
|
||||||
|
|
||||||
//fake the in container work
|
|
||||||
em.unwrap( Session.class ).disconnect();
|
|
||||||
stream = new ByteArrayOutputStream();
|
|
||||||
out = new ObjectOutputStream( stream );
|
|
||||||
out.writeObject( em );
|
|
||||||
out.close();
|
|
||||||
serialized = stream.toByteArray();
|
|
||||||
stream.close();
|
|
||||||
byteIn = new ByteArrayInputStream( serialized );
|
|
||||||
in = new ObjectInputStream( byteIn );
|
|
||||||
em = (EntityManager) in.readObject();
|
|
||||||
in.close();
|
|
||||||
byteIn.close();
|
|
||||||
//fake the in container work
|
|
||||||
em.getTransaction().begin();
|
|
||||||
item = em.find( Item.class, item.getName() );
|
|
||||||
item.setDescr( item.getDescr() + "-Amsterdam" );
|
|
||||||
cat = (Cat) em.createQuery( "select c from " + Cat.class.getName() + " c" ).getSingleResult();
|
|
||||||
cat.setLength( 34 );
|
|
||||||
em.flush();
|
|
||||||
em.remove( item );
|
|
||||||
em.remove( cat );
|
|
||||||
em.flush();
|
|
||||||
em.getTransaction().commit();
|
|
||||||
|
|
||||||
em.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEntityManagerFactorySerialization() throws Exception {
|
|
||||||
EntityManagerFactory entityManagerFactory = entityManagerFactory();
|
|
||||||
|
|
||||||
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
|
||||||
ObjectOutput out = new ObjectOutputStream( stream );
|
|
||||||
out.writeObject( entityManagerFactory );
|
|
||||||
out.close();
|
|
||||||
byte[] serialized = stream.toByteArray();
|
|
||||||
stream.close();
|
|
||||||
ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
|
|
||||||
ObjectInputStream in = new ObjectInputStream( byteIn );
|
|
||||||
EntityManagerFactory entityManagerFactory2 = (EntityManagerFactory) in.readObject();
|
|
||||||
in.close();
|
|
||||||
byteIn.close();
|
|
||||||
|
|
||||||
assertTrue("deserialized EntityManagerFactory should be the same original EntityManagerFactory instance",
|
|
||||||
entityManagerFactory2 == entityManagerFactory);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEntityManagerFactoryProperties() {
|
|
||||||
EntityManagerFactory entityManagerFactory = entityManagerFactory();
|
|
||||||
assertTrue( entityManagerFactory.getProperties().containsKey( AvailableSettings.USER ) );
|
|
||||||
if ( entityManagerFactory.getProperties().containsKey( AvailableSettings.PASS ) ) {
|
|
||||||
assertEquals( "****", entityManagerFactory.getProperties().get( AvailableSettings.PASS ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[]{
|
|
||||||
Item.class,
|
|
||||||
Distributor.class,
|
|
||||||
Wallet.class,
|
|
||||||
Cat.class,
|
|
||||||
Kitten.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.connection;
|
package org.hibernate.orm.test.jpa.connection;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.connection;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.Properties;
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
|
import org.hibernate.cfg.Environment;
|
||||||
|
import org.hibernate.engine.jdbc.connections.internal.UserSuppliedConnectionProviderImpl;
|
||||||
|
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
|
||||||
|
public class ConnectionProviderDecorator extends UserSuppliedConnectionProviderImpl {
|
||||||
|
|
||||||
|
private final DataSource dataSource;
|
||||||
|
|
||||||
|
private int connectionCount;
|
||||||
|
|
||||||
|
public Connection connection;
|
||||||
|
|
||||||
|
public ConnectionProviderDecorator(){
|
||||||
|
String url = Environment.getProperties().getProperty( Environment.URL );
|
||||||
|
|
||||||
|
Properties connectionProps = new Properties();
|
||||||
|
connectionProps.put( "user", Environment.getProperties().getProperty( Environment.USER ) );
|
||||||
|
connectionProps.put( "password", Environment.getProperties().getProperty( Environment.PASS ) );
|
||||||
|
|
||||||
|
dataSource = new BaseDataSource() {
|
||||||
|
@Override
|
||||||
|
public Connection getConnection() throws SQLException {
|
||||||
|
return DriverManager.getConnection( url, connectionProps );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Connection getConnection(String username, String password) throws SQLException {
|
||||||
|
return DriverManager.getConnection( url, connectionProps );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Connection getConnection() throws SQLException {
|
||||||
|
connectionCount++;
|
||||||
|
connection = spy( dataSource.getConnection() );
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void closeConnection(Connection connection) throws SQLException {
|
||||||
|
connection.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getConnectionCount() {
|
||||||
|
return this.connectionCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear() {
|
||||||
|
connectionCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.connection;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
import org.hibernate.dialect.H2Dialect;
|
||||||
|
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
|
||||||
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
|
||||||
|
import org.hibernate.testing.orm.junit.Jpa;
|
||||||
|
import org.hibernate.testing.orm.junit.RequiresDialect;
|
||||||
|
import org.hibernate.testing.orm.junit.Setting;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Vlad Mihalcea
|
||||||
|
*/
|
||||||
|
@TestForIssue(jiraKey = "HHH-12197")
|
||||||
|
@RequiresDialect(H2Dialect.class)
|
||||||
|
@Jpa(
|
||||||
|
annotatedClasses = { ConnectionsReleaseAutoCommitTest.Thing.class },
|
||||||
|
integrationSettings = @Setting(name = AvailableSettings.CONNECTION_PROVIDER, value = "org.hibernate.orm.test.jpa.connection.ConnectionProviderDecorator")
|
||||||
|
)
|
||||||
|
public class ConnectionsReleaseAutoCommitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testConnectionAcquisitionCount(EntityManagerFactoryScope scope) throws SQLException {
|
||||||
|
ConnectionProviderDecorator connectionProvider = getConnectionProvider( scope );
|
||||||
|
connectionProvider.clear();
|
||||||
|
|
||||||
|
scope.inTransaction( entityManager -> {
|
||||||
|
assertEquals( 1, connectionProvider.getConnectionCount() );
|
||||||
|
Thing thing = new Thing();
|
||||||
|
thing.setId( 1 );
|
||||||
|
entityManager.persist( thing );
|
||||||
|
assertEquals( 1, connectionProvider.getConnectionCount() );
|
||||||
|
} );
|
||||||
|
|
||||||
|
assertEquals( 1, connectionProvider.getConnectionCount() );
|
||||||
|
verify( connectionProvider.connection, times( 1 ) ).close();
|
||||||
|
Mockito.reset( connectionProvider.connection );
|
||||||
|
}
|
||||||
|
|
||||||
|
private ConnectionProviderDecorator getConnectionProvider(EntityManagerFactoryScope scope) {
|
||||||
|
return (ConnectionProviderDecorator) ( (SessionFactoryImplementor) ( scope
|
||||||
|
.getEntityManagerFactory() ) ).getServiceRegistry().getService( ConnectionProvider.class );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity(name = "Thing")
|
||||||
|
@Table(name = "Thing")
|
||||||
|
public static class Thing {
|
||||||
|
@Id
|
||||||
|
public Integer id;
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
|
|
||||||
package org.hibernate.jpa.test.connection;
|
package org.hibernate.orm.test.jpa.connection;
|
||||||
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
@ -31,8 +31,8 @@ import org.hibernate.jpa.test.xml.Light;
|
||||||
import org.hibernate.jpa.test.xml.Lighter;
|
import org.hibernate.jpa.test.xml.Lighter;
|
||||||
|
|
||||||
import org.hibernate.testing.util.jpa.PersistenceUnitInfoAdapter;
|
import org.hibernate.testing.util.jpa.PersistenceUnitInfoAdapter;
|
||||||
import org.junit.Assert;
|
import org.junit.jupiter.api.Assertions;
|
||||||
import org.junit.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Emmanuel Bernard
|
* @author Emmanuel Bernard
|
||||||
|
@ -58,7 +58,7 @@ public class DataSourceInjectionTest {
|
||||||
|
|
||||||
try ( final SessionImplementor session = sf.openSession().unwrap( SessionImplementor.class ) ) {
|
try ( final SessionImplementor session = sf.openSession().unwrap( SessionImplementor.class ) ) {
|
||||||
session.createQuery( "select i from Item i" ).list();
|
session.createQuery( "select i from Item i" ).list();
|
||||||
Assert.fail( "Expecting FakeDataSourceException" );
|
Assertions.fail( "Expecting FakeDataSourceException" );
|
||||||
}
|
}
|
||||||
catch (PersistenceException pe) {
|
catch (PersistenceException pe) {
|
||||||
try {
|
try {
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.connection;
|
package org.hibernate.orm.test.jpa.connection;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.connection;
|
package org.hibernate.orm.test.jpa.connection;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.criteria;
|
||||||
|
|
||||||
|
import org.hibernate.jpa.test.metamodel.Address;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Alias;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Country;
|
||||||
|
import org.hibernate.jpa.test.metamodel.CreditCard;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Customer;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Entity1;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Entity2;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Entity3;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Info;
|
||||||
|
import org.hibernate.jpa.test.metamodel.LineItem;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Order;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Phone;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Product;
|
||||||
|
import org.hibernate.jpa.test.metamodel.ShelfLife;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Spouse;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Thing;
|
||||||
|
import org.hibernate.jpa.test.metamodel.ThingWithQuantity;
|
||||||
|
import org.hibernate.jpa.test.metamodel.VersionedEntity;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.Jpa;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Jan Schatteman
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Jpa(annotatedClasses = {
|
||||||
|
Address.class,
|
||||||
|
Alias.class,
|
||||||
|
Country.class,
|
||||||
|
CreditCard.class,
|
||||||
|
Customer.class,
|
||||||
|
Entity1.class,
|
||||||
|
Entity2.class,
|
||||||
|
Entity3.class,
|
||||||
|
Info.class,
|
||||||
|
LineItem.class,
|
||||||
|
Order.class,
|
||||||
|
Phone.class,
|
||||||
|
Product.class,
|
||||||
|
ShelfLife.class,
|
||||||
|
Spouse.class,
|
||||||
|
Thing.class,
|
||||||
|
ThingWithQuantity.class,
|
||||||
|
VersionedEntity.class
|
||||||
|
})
|
||||||
|
public abstract class AbstractCriteriaTest {
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.criteria;
|
||||||
|
|
||||||
|
import javax.persistence.criteria.CollectionJoin;
|
||||||
|
import javax.persistence.criteria.CriteriaQuery;
|
||||||
|
import javax.persistence.criteria.Root;
|
||||||
|
|
||||||
|
import org.hibernate.jpa.test.metamodel.LineItem;
|
||||||
|
import org.hibernate.jpa.test.metamodel.LineItem_;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Order;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Order_;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Similar to {@link org.hibernate.orm.test.query.hql.OnKeywordTest}, but here testing from JPA criteria queries.
|
||||||
|
*
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public class OnKeywordTest extends AbstractCriteriaTest {
|
||||||
|
@Test
|
||||||
|
public void basicTest(EntityManagerFactoryScope scope) {
|
||||||
|
|
||||||
|
scope.inEntityManager(
|
||||||
|
entityManager -> {
|
||||||
|
CriteriaQuery<Order> criteria = entityManager.getCriteriaBuilder().createQuery( Order.class );
|
||||||
|
Root<Order> root = criteria.from( Order.class );
|
||||||
|
criteria.select( root );
|
||||||
|
CollectionJoin<Order, LineItem> lineItemsJoin = root.join( Order_.lineItems );
|
||||||
|
lineItemsJoin.on(
|
||||||
|
entityManager.getCriteriaBuilder().gt(
|
||||||
|
lineItemsJoin.get( LineItem_.quantity ),
|
||||||
|
entityManager.getCriteriaBuilder().literal( 20 )
|
||||||
|
)
|
||||||
|
);
|
||||||
|
entityManager.createQuery( criteria ).getResultList();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.criteria.basic;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.persistence.criteria.CriteriaBuilder;
|
||||||
|
import javax.persistence.criteria.CriteriaQuery;
|
||||||
|
import javax.persistence.criteria.Root;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.DerbyDialect;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Product;
|
||||||
|
import org.hibernate.jpa.test.metamodel.Product_;
|
||||||
|
import org.hibernate.orm.test.jpa.criteria.AbstractCriteriaTest;
|
||||||
|
|
||||||
|
import org.hibernate.testing.SkipForDialect;
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class CastTest extends AbstractCriteriaTest {
|
||||||
|
private static final int QUANTITY = 2;
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
public void tearDown(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
entityManager.createQuery( "delete from Product" ).executeUpdate();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@SkipForDialect(value = DerbyDialect.class, comment = "Derby does not support cast from INTEGER to VARCHAR")
|
||||||
|
@TestForIssue(jiraKey = "HHH-5755")
|
||||||
|
public void testCastToString(EntityManagerFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
Product product = new Product();
|
||||||
|
product.setId( "product1" );
|
||||||
|
product.setPrice( 1.23d );
|
||||||
|
product.setQuantity( QUANTITY );
|
||||||
|
product.setPartNumber( ( (long) Integer.MAX_VALUE ) + 1 );
|
||||||
|
product.setRating( 1.999f );
|
||||||
|
product.setSomeBigInteger( BigInteger.valueOf( 987654321 ) );
|
||||||
|
product.setSomeBigDecimal( BigDecimal.valueOf( 987654.321 ) );
|
||||||
|
entityManager.persist( product );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
scope.inTransaction(
|
||||||
|
entityManager -> {
|
||||||
|
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
|
||||||
|
CriteriaQuery<Product> criteria = builder.createQuery( Product.class );
|
||||||
|
Root<Product> root = criteria.from( Product.class );
|
||||||
|
criteria.where( builder.equal(
|
||||||
|
root.get( Product_.quantity ).as( String.class ),
|
||||||
|
builder.literal( String.valueOf( QUANTITY ) )
|
||||||
|
) );
|
||||||
|
List<Product> result = entityManager.createQuery( criteria ).getResultList();
|
||||||
|
Assertions.assertEquals( 1, result.size() );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,30 +4,31 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.ejb3configuration;
|
package org.hibernate.orm.test.jpa.ejb3configuration;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import javax.persistence.SharedCacheMode;
|
import javax.persistence.SharedCacheMode;
|
||||||
import javax.persistence.ValidationMode;
|
import javax.persistence.ValidationMode;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.jpa.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl;
|
import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl;
|
||||||
import org.hibernate.jpa.boot.spi.Bootstrap;
|
import org.hibernate.jpa.boot.spi.Bootstrap;
|
||||||
import org.hibernate.jpa.test.PersistenceUnitInfoAdapter;
|
import org.hibernate.jpa.test.PersistenceUnitInfoAdapter;
|
||||||
|
|
||||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
import org.hibernate.testing.orm.junit.BaseUnitTest;
|
||||||
import org.junit.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test passing along various config settings that take objects other than strings as values.
|
* Test passing along various config settings that take objects other than strings as values.
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class ConfigurationObjectSettingTest extends BaseUnitTestCase {
|
@BaseUnitTest
|
||||||
|
public class ConfigurationObjectSettingTest {
|
||||||
@Test
|
@Test
|
||||||
public void testContainerBootstrapSharedCacheMode() {
|
public void testContainerBootstrapSharedCacheMode() {
|
||||||
// first, via the integration vars
|
// first, via the integration vars
|
||||||
|
@ -36,17 +37,17 @@ public class ConfigurationObjectSettingTest extends BaseUnitTestCase {
|
||||||
// as object
|
// as object
|
||||||
EntityManagerFactoryBuilderImpl builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
EntityManagerFactoryBuilderImpl builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
||||||
empty,
|
empty,
|
||||||
Collections.singletonMap( AvailableSettings.SHARED_CACHE_MODE, SharedCacheMode.DISABLE_SELECTIVE )
|
Collections.singletonMap( AvailableSettings.JPA_SHARED_CACHE_MODE, SharedCacheMode.DISABLE_SELECTIVE )
|
||||||
);
|
);
|
||||||
assertEquals( SharedCacheMode.DISABLE_SELECTIVE, builder.getConfigurationValues().get( AvailableSettings.SHARED_CACHE_MODE ) );
|
assertEquals( SharedCacheMode.DISABLE_SELECTIVE, builder.getConfigurationValues().get( AvailableSettings.JPA_SHARED_CACHE_MODE ) );
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
// as string
|
// as string
|
||||||
EntityManagerFactoryBuilderImpl builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
EntityManagerFactoryBuilderImpl builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
||||||
empty,
|
empty,
|
||||||
Collections.singletonMap( AvailableSettings.SHARED_CACHE_MODE, SharedCacheMode.DISABLE_SELECTIVE.name() )
|
Collections.singletonMap( AvailableSettings.JPA_SHARED_CACHE_MODE, SharedCacheMode.DISABLE_SELECTIVE.name() )
|
||||||
);
|
);
|
||||||
assertEquals( SharedCacheMode.DISABLE_SELECTIVE.name(), builder.getConfigurationValues().get( AvailableSettings.SHARED_CACHE_MODE ) );
|
assertEquals( SharedCacheMode.DISABLE_SELECTIVE.name(), builder.getConfigurationValues().get( AvailableSettings.JPA_SHARED_CACHE_MODE ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// next, via the PUI
|
// next, via the PUI
|
||||||
|
@ -61,16 +62,16 @@ public class ConfigurationObjectSettingTest extends BaseUnitTestCase {
|
||||||
adapter,
|
adapter,
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
assertEquals( SharedCacheMode.ENABLE_SELECTIVE, builder.getConfigurationValues().get( AvailableSettings.SHARED_CACHE_MODE ) );
|
assertEquals( SharedCacheMode.ENABLE_SELECTIVE, builder.getConfigurationValues().get( AvailableSettings.JPA_SHARED_CACHE_MODE ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// via both, integration vars should take precedence
|
// via both, integration vars should take precedence
|
||||||
{
|
{
|
||||||
EntityManagerFactoryBuilderImpl builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
EntityManagerFactoryBuilderImpl builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
||||||
adapter,
|
adapter,
|
||||||
Collections.singletonMap( AvailableSettings.SHARED_CACHE_MODE, SharedCacheMode.DISABLE_SELECTIVE )
|
Collections.singletonMap( AvailableSettings.JPA_SHARED_CACHE_MODE, SharedCacheMode.DISABLE_SELECTIVE )
|
||||||
);
|
);
|
||||||
assertEquals( SharedCacheMode.DISABLE_SELECTIVE, builder.getConfigurationValues().get( AvailableSettings.SHARED_CACHE_MODE ) );
|
assertEquals( SharedCacheMode.DISABLE_SELECTIVE, builder.getConfigurationValues().get( AvailableSettings.JPA_SHARED_CACHE_MODE ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,17 +83,17 @@ public class ConfigurationObjectSettingTest extends BaseUnitTestCase {
|
||||||
// as object
|
// as object
|
||||||
EntityManagerFactoryBuilderImpl builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
EntityManagerFactoryBuilderImpl builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
||||||
empty,
|
empty,
|
||||||
Collections.singletonMap( AvailableSettings.VALIDATION_MODE, ValidationMode.CALLBACK )
|
Collections.singletonMap( AvailableSettings.JPA_VALIDATION_MODE, ValidationMode.CALLBACK )
|
||||||
);
|
);
|
||||||
assertEquals( ValidationMode.CALLBACK, builder.getConfigurationValues().get( AvailableSettings.VALIDATION_MODE ) );
|
assertEquals( ValidationMode.CALLBACK, builder.getConfigurationValues().get( AvailableSettings.JPA_VALIDATION_MODE ) );
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
// as string
|
// as string
|
||||||
EntityManagerFactoryBuilderImpl builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
EntityManagerFactoryBuilderImpl builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
||||||
empty,
|
empty,
|
||||||
Collections.singletonMap( AvailableSettings.VALIDATION_MODE, ValidationMode.CALLBACK.name() )
|
Collections.singletonMap( AvailableSettings.JPA_VALIDATION_MODE, ValidationMode.CALLBACK.name() )
|
||||||
);
|
);
|
||||||
assertEquals( ValidationMode.CALLBACK.name(), builder.getConfigurationValues().get( AvailableSettings.VALIDATION_MODE ) );
|
assertEquals( ValidationMode.CALLBACK.name(), builder.getConfigurationValues().get( AvailableSettings.JPA_VALIDATION_MODE ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// next, via the PUI
|
// next, via the PUI
|
||||||
|
@ -107,16 +108,16 @@ public class ConfigurationObjectSettingTest extends BaseUnitTestCase {
|
||||||
adapter,
|
adapter,
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
assertEquals( ValidationMode.CALLBACK, builder.getConfigurationValues().get( AvailableSettings.VALIDATION_MODE ) );
|
assertEquals( ValidationMode.CALLBACK, builder.getConfigurationValues().get( AvailableSettings.JPA_VALIDATION_MODE ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// via both, integration vars should take precedence
|
// via both, integration vars should take precedence
|
||||||
{
|
{
|
||||||
EntityManagerFactoryBuilderImpl builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
EntityManagerFactoryBuilderImpl builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
||||||
adapter,
|
adapter,
|
||||||
Collections.singletonMap( AvailableSettings.VALIDATION_MODE, ValidationMode.NONE )
|
Collections.singletonMap( AvailableSettings.JPA_VALIDATION_MODE, ValidationMode.NONE )
|
||||||
);
|
);
|
||||||
assertEquals( ValidationMode.NONE, builder.getConfigurationValues().get( AvailableSettings.VALIDATION_MODE ) );
|
assertEquals( ValidationMode.NONE, builder.getConfigurationValues().get( AvailableSettings.JPA_VALIDATION_MODE ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +128,7 @@ public class ConfigurationObjectSettingTest extends BaseUnitTestCase {
|
||||||
try {
|
try {
|
||||||
Bootstrap.getEntityManagerFactoryBuilder(
|
Bootstrap.getEntityManagerFactoryBuilder(
|
||||||
adapter,
|
adapter,
|
||||||
Collections.singletonMap( AvailableSettings.VALIDATION_FACTORY, token )
|
Collections.singletonMap( AvailableSettings.JPA_VALIDATION_FACTORY, token )
|
||||||
);
|
);
|
||||||
fail( "Was expecting error as token did not implement ValidatorFactory" );
|
fail( "Was expecting error as token did not implement ValidatorFactory" );
|
||||||
}
|
}
|
|
@ -0,0 +1,145 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.ejb3configuration;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutput;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
import java.util.Date;
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.EntityManagerFactory;
|
||||||
|
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
import org.hibernate.jpa.test.Cat;
|
||||||
|
import org.hibernate.jpa.test.Distributor;
|
||||||
|
import org.hibernate.jpa.test.Item;
|
||||||
|
import org.hibernate.jpa.test.Kitten;
|
||||||
|
import org.hibernate.jpa.test.Wallet;
|
||||||
|
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
|
||||||
|
import org.hibernate.testing.orm.junit.Jpa;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Jpa(annotatedClasses = {
|
||||||
|
Item.class,
|
||||||
|
Distributor.class,
|
||||||
|
Wallet.class,
|
||||||
|
Cat.class,
|
||||||
|
Kitten.class
|
||||||
|
})
|
||||||
|
public class EntityManagerFactorySerializationTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSerialization(EntityManagerFactoryScope scope) throws Exception {
|
||||||
|
EntityManagerFactory emf = scope.getEntityManagerFactory();
|
||||||
|
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||||
|
ObjectOutput out = new ObjectOutputStream( stream );
|
||||||
|
out.writeObject( emf );
|
||||||
|
out.close();
|
||||||
|
byte[] serialized = stream.toByteArray();
|
||||||
|
stream.close();
|
||||||
|
ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
|
||||||
|
ObjectInputStream in = new ObjectInputStream( byteIn );
|
||||||
|
EntityManagerFactory serializedFactory = (EntityManagerFactory) in.readObject();
|
||||||
|
in.close();
|
||||||
|
byteIn.close();
|
||||||
|
EntityManager em = serializedFactory.createEntityManager();
|
||||||
|
try {
|
||||||
|
//em.getTransaction().begin();
|
||||||
|
//em.setFlushMode( FlushModeType.NEVER );
|
||||||
|
Cat cat = new Cat();
|
||||||
|
cat.setAge( 3 );
|
||||||
|
cat.setDateOfBirth( new Date() );
|
||||||
|
cat.setLength( 22 );
|
||||||
|
cat.setName( "Kitty" );
|
||||||
|
em.persist( cat );
|
||||||
|
Item item = new Item();
|
||||||
|
item.setName( "Train Ticket" );
|
||||||
|
item.setDescr( "Paris-London" );
|
||||||
|
em.persist( item );
|
||||||
|
//em.getTransaction().commit();
|
||||||
|
//em.getTransaction().begin();
|
||||||
|
item.setDescr( "Paris-Bruxelles" );
|
||||||
|
//em.getTransaction().commit();
|
||||||
|
|
||||||
|
//fake the in container work
|
||||||
|
em.unwrap( Session.class ).disconnect();
|
||||||
|
stream = new ByteArrayOutputStream();
|
||||||
|
out = new ObjectOutputStream( stream );
|
||||||
|
out.writeObject( em );
|
||||||
|
out.close();
|
||||||
|
serialized = stream.toByteArray();
|
||||||
|
stream.close();
|
||||||
|
byteIn = new ByteArrayInputStream( serialized );
|
||||||
|
in = new ObjectInputStream( byteIn );
|
||||||
|
em = (EntityManager) in.readObject();
|
||||||
|
in.close();
|
||||||
|
byteIn.close();
|
||||||
|
//fake the in container work
|
||||||
|
em.getTransaction().begin();
|
||||||
|
item = em.find( Item.class, item.getName() );
|
||||||
|
item.setDescr( item.getDescr() + "-Amsterdam" );
|
||||||
|
cat = (Cat) em.createQuery( "select c from " + Cat.class.getName() + " c" ).getSingleResult();
|
||||||
|
cat.setLength( 34 );
|
||||||
|
em.flush();
|
||||||
|
em.remove( item );
|
||||||
|
em.remove( cat );
|
||||||
|
em.flush();
|
||||||
|
em.getTransaction().commit();
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
if ( em.getTransaction().isActive() ) {
|
||||||
|
em.getTransaction().rollback();
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
em.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEntityManagerFactorySerialization(EntityManagerFactoryScope scope) throws Exception {
|
||||||
|
EntityManagerFactory entityManagerFactory = scope.getEntityManagerFactory();
|
||||||
|
|
||||||
|
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||||
|
ObjectOutput out = new ObjectOutputStream( stream );
|
||||||
|
out.writeObject( entityManagerFactory );
|
||||||
|
out.close();
|
||||||
|
byte[] serialized = stream.toByteArray();
|
||||||
|
stream.close();
|
||||||
|
ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
|
||||||
|
ObjectInputStream in = new ObjectInputStream( byteIn );
|
||||||
|
EntityManagerFactory entityManagerFactory2 = (EntityManagerFactory) in.readObject();
|
||||||
|
in.close();
|
||||||
|
byteIn.close();
|
||||||
|
|
||||||
|
assertTrue(
|
||||||
|
entityManagerFactory2 == entityManagerFactory,
|
||||||
|
"deserialized EntityManagerFactory should be the same original EntityManagerFactory instance"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEntityManagerFactoryProperties(EntityManagerFactoryScope scope) {
|
||||||
|
EntityManagerFactory entityManagerFactory = scope.getEntityManagerFactory();
|
||||||
|
assertTrue( entityManagerFactory.getProperties().containsKey( AvailableSettings.USER ) );
|
||||||
|
if ( entityManagerFactory.getProperties().containsKey( AvailableSettings.PASS ) ) {
|
||||||
|
assertEquals( "****", entityManagerFactory.getProperties().get( AvailableSettings.PASS ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.jpa.test.ejb3configuration;
|
package org.hibernate.orm.test.jpa.ejb3configuration;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.ejb3configuration;
|
package org.hibernate.orm.test.jpa.ejb3configuration;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -16,8 +16,6 @@ import org.hibernate.SessionFactory;
|
||||||
import org.hibernate.boot.Metadata;
|
import org.hibernate.boot.Metadata;
|
||||||
import org.hibernate.boot.MetadataSources;
|
import org.hibernate.boot.MetadataSources;
|
||||||
import org.hibernate.boot.SessionFactoryBuilder;
|
import org.hibernate.boot.SessionFactoryBuilder;
|
||||||
import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;
|
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistry;
|
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.boot.registry.internal.StandardServiceRegistryImpl;
|
import org.hibernate.boot.registry.internal.StandardServiceRegistryImpl;
|
||||||
import org.hibernate.cfg.Environment;
|
import org.hibernate.cfg.Environment;
|
||||||
|
@ -29,13 +27,13 @@ import org.hibernate.jpa.test.Item;
|
||||||
import org.hibernate.jpa.test.PersistenceUnitDescriptorAdapter;
|
import org.hibernate.jpa.test.PersistenceUnitDescriptorAdapter;
|
||||||
import org.hibernate.jpa.test.SettingsGenerator;
|
import org.hibernate.jpa.test.SettingsGenerator;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.Test;
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
|
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Emmanuel Bernard
|
* @author Emmanuel Bernard
|
||||||
|
@ -51,7 +49,7 @@ public class InterceptorTest {
|
||||||
|
|
||||||
private EntityManagerFactory entityManagerFactory;
|
private EntityManagerFactory entityManagerFactory;
|
||||||
|
|
||||||
@After
|
@AfterEach
|
||||||
public void releaseResources() {
|
public void releaseResources() {
|
||||||
if ( entityManagerFactory != null ) {
|
if ( entityManagerFactory != null ) {
|
||||||
entityManagerFactory.close();
|
entityManagerFactory.close();
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$
|
//$
|
||||||
package org.hibernate.jpa.test.ejb3configuration;
|
package org.hibernate.orm.test.jpa.ejb3configuration;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.ejb3configuration;
|
package org.hibernate.orm.test.jpa.ejb3configuration;
|
||||||
|
|
||||||
import javax.persistence.EntityManagerFactory;
|
import javax.persistence.EntityManagerFactory;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
@ -15,17 +15,18 @@ import org.hibernate.jpa.boot.spi.Bootstrap;
|
||||||
import org.hibernate.jpa.test.MyNamingStrategy;
|
import org.hibernate.jpa.test.MyNamingStrategy;
|
||||||
import org.hibernate.jpa.test.PersistenceUnitInfoAdapter;
|
import org.hibernate.jpa.test.PersistenceUnitInfoAdapter;
|
||||||
|
|
||||||
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
import org.hibernate.testing.orm.junit.BaseUnitTest;
|
||||||
import org.junit.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
|
import static org.hibernate.testing.orm.junit.ExtraAssertions.assertTyping;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Gail Badner
|
* @author Gail Badner
|
||||||
*/
|
*/
|
||||||
public class NamingStrategyConfigurationTest extends BaseUnitTestCase {
|
@BaseUnitTest
|
||||||
|
public class NamingStrategyConfigurationTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNamingStrategyFromProperty() {
|
public void testNamingStrategyFromProperty() {
|
||||||
|
@ -35,7 +36,10 @@ public class NamingStrategyConfigurationTest extends BaseUnitTestCase {
|
||||||
PersistenceUnitInfoAdapter adapter = new PersistenceUnitInfoAdapter();
|
PersistenceUnitInfoAdapter adapter = new PersistenceUnitInfoAdapter();
|
||||||
EntityManagerFactoryBuilderImpl builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
EntityManagerFactoryBuilderImpl builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
||||||
adapter,
|
adapter,
|
||||||
Collections.singletonMap( AvailableSettings.PHYSICAL_NAMING_STRATEGY, MyNamingStrategy.class.getName() )
|
Collections.singletonMap(
|
||||||
|
AvailableSettings.PHYSICAL_NAMING_STRATEGY,
|
||||||
|
MyNamingStrategy.class.getName()
|
||||||
|
)
|
||||||
);
|
);
|
||||||
final EntityManagerFactory emf = builder.build();
|
final EntityManagerFactory emf = builder.build();
|
||||||
try {
|
try {
|
||||||
|
@ -48,7 +52,8 @@ public class NamingStrategyConfigurationTest extends BaseUnitTestCase {
|
||||||
MyNamingStrategy.class,
|
MyNamingStrategy.class,
|
||||||
builder.getMetadata().getMetadataBuildingOptions().getPhysicalNamingStrategy()
|
builder.getMetadata().getMetadataBuildingOptions().getPhysicalNamingStrategy()
|
||||||
);
|
);
|
||||||
}finally {
|
}
|
||||||
|
finally {
|
||||||
if ( emf != null ) {
|
if ( emf != null ) {
|
||||||
emf.close();
|
emf.close();
|
||||||
}
|
}
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.ejb3configuration;
|
package org.hibernate.orm.test.jpa.ejb3configuration;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -39,6 +39,7 @@ import org.hibernate.jpa.AvailableSettings;
|
||||||
import org.hibernate.jpa.boot.spi.Bootstrap;
|
import org.hibernate.jpa.boot.spi.Bootstrap;
|
||||||
import org.hibernate.jpa.test.PersistenceUnitDescriptorAdapter;
|
import org.hibernate.jpa.test.PersistenceUnitDescriptorAdapter;
|
||||||
import org.hibernate.jpa.test.SettingsGenerator;
|
import org.hibernate.jpa.test.SettingsGenerator;
|
||||||
|
import org.hibernate.jpa.test.ejb3configuration.Bell;
|
||||||
import org.hibernate.mapping.Collection;
|
import org.hibernate.mapping.Collection;
|
||||||
import org.hibernate.mapping.PersistentClass;
|
import org.hibernate.mapping.PersistentClass;
|
||||||
import org.hibernate.metadata.ClassMetadata;
|
import org.hibernate.metadata.ClassMetadata;
|
||||||
|
@ -67,8 +68,8 @@ import org.hibernate.type.Type;
|
||||||
import org.hibernate.type.VersionType;
|
import org.hibernate.type.VersionType;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.jupiter.api.Assertions;
|
||||||
import org.junit.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author <a href="mailto:emmanuel@hibernate.org">Emmanuel Bernard</a>
|
* @author <a href="mailto:emmanuel@hibernate.org">Emmanuel Bernard</a>
|
||||||
|
@ -89,9 +90,9 @@ public class PersisterClassProviderTest {
|
||||||
entityManagerFactory.close();
|
entityManagerFactory.close();
|
||||||
}
|
}
|
||||||
catch ( PersistenceException e ) {
|
catch ( PersistenceException e ) {
|
||||||
Assert.assertNotNull( e.getCause() );
|
Assertions.assertNotNull( e.getCause() );
|
||||||
Assert.assertNotNull( e.getCause().getCause() );
|
Assertions.assertNotNull( e.getCause().getCause() );
|
||||||
Assert.assertEquals( GoofyException.class, e.getCause().getCause().getClass() );
|
Assertions.assertEquals( GoofyException.class, e.getCause().getCause().getClass() );
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -4,14 +4,14 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.ejb3configuration;
|
package org.hibernate.orm.test.jpa.ejb3configuration;
|
||||||
|
|
||||||
import javax.persistence.EntityManagerFactory;
|
import javax.persistence.EntityManagerFactory;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.jupiter.api.Assertions;
|
||||||
import org.junit.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.hibernate.SessionFactory;
|
import org.hibernate.SessionFactory;
|
||||||
import org.hibernate.SessionFactoryObserver;
|
import org.hibernate.SessionFactoryObserver;
|
||||||
|
@ -38,7 +38,7 @@ public class SessionFactoryObserverTest {
|
||||||
try {
|
try {
|
||||||
final EntityManagerFactory entityManagerFactory = builder.build();
|
final EntityManagerFactory entityManagerFactory = builder.build();
|
||||||
entityManagerFactory.close();
|
entityManagerFactory.close();
|
||||||
Assert.fail( "GoofyException should have been thrown" );
|
Assertions.fail( "GoofyException should have been thrown" );
|
||||||
}
|
}
|
||||||
catch ( GoofyException e ) {
|
catch ( GoofyException e ) {
|
||||||
//success
|
//success
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.ejb3configuration.id;
|
package org.hibernate.orm.test.jpa.ejb3configuration.id;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.ejb3configuration.id;
|
package org.hibernate.orm.test.jpa.ejb3configuration.id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author <a href="mailto:emmanuel@hibernate.org">Emmanuel Bernard</a>
|
* @author <a href="mailto:emmanuel@hibernate.org">Emmanuel Bernard</a>
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.ejb3configuration.id;
|
package org.hibernate.orm.test.jpa.ejb3configuration.id;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.ejb3configuration.id;
|
package org.hibernate.orm.test.jpa.ejb3configuration.id;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.ejb3configuration.id;
|
package org.hibernate.orm.test.jpa.ejb3configuration.id;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import javax.persistence.EntityManager;
|
||||||
import javax.persistence.EntityManagerFactory;
|
import javax.persistence.EntityManagerFactory;
|
||||||
|
@ -17,8 +17,8 @@ import org.hibernate.jpa.test.PersistenceUnitInfoAdapter;
|
||||||
import org.hibernate.jpa.AvailableSettings;
|
import org.hibernate.jpa.AvailableSettings;
|
||||||
import org.hibernate.jpa.boot.spi.Bootstrap;
|
import org.hibernate.jpa.boot.spi.Bootstrap;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.jupiter.api.Assertions;
|
||||||
import org.junit.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author <a href="mailto:emmanuel@hibernate.org">Emmanuel Bernard</a>
|
* @author <a href="mailto:emmanuel@hibernate.org">Emmanuel Bernard</a>
|
||||||
|
@ -43,7 +43,7 @@ public class IdentifierGeneratorStrategyProviderTest {
|
||||||
try {
|
try {
|
||||||
entityManager.persist( new Cable() );
|
entityManager.persist( new Cable() );
|
||||||
entityManager.flush();
|
entityManager.flush();
|
||||||
Assert.fail( "FunkyException should have been thrown when the id is generated" );
|
Assertions.fail( "FunkyException should have been thrown when the id is generated" );
|
||||||
}
|
}
|
||||||
catch ( FunkyException e ) {
|
catch ( FunkyException e ) {
|
||||||
entityManager.close();
|
entityManager.close();
|
|
@ -1,148 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
|
||||||
*/
|
|
||||||
package org.hibernate.test.connections;
|
|
||||||
|
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.DriverManager;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Properties;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.Table;
|
|
||||||
import javax.sql.DataSource;
|
|
||||||
|
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
|
||||||
import org.hibernate.cfg.Environment;
|
|
||||||
import org.hibernate.dialect.H2Dialect;
|
|
||||||
import org.hibernate.engine.jdbc.connections.internal.UserSuppliedConnectionProviderImpl;
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
|
||||||
import org.hibernate.jpa.test.connection.BaseDataSource;
|
|
||||||
|
|
||||||
import org.hibernate.testing.RequiresDialect;
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.mockito.Mockito;
|
|
||||||
import org.mockito.internal.util.MockUtil;
|
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.mockito.Mockito.spy;
|
|
||||||
import static org.mockito.Mockito.times;
|
|
||||||
import static org.mockito.Mockito.verify;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Vlad Mihalcea
|
|
||||||
*/
|
|
||||||
@TestForIssue(jiraKey = "HHH-12197")
|
|
||||||
@RequiresDialect(H2Dialect.class)
|
|
||||||
public class ConnectionsReleaseAutoCommitTest extends BaseEntityManagerFunctionalTestCase {
|
|
||||||
|
|
||||||
private ConnectionProviderDecorator connectionProvider;
|
|
||||||
|
|
||||||
private Connection connection;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Map getConfig() {
|
|
||||||
Map config = super.getConfig();
|
|
||||||
|
|
||||||
String url = Environment.getProperties().getProperty( Environment.URL );
|
|
||||||
|
|
||||||
Properties connectionProps = new Properties();
|
|
||||||
connectionProps.put("user", Environment.getProperties().getProperty( Environment.USER ));
|
|
||||||
connectionProps.put("password", Environment.getProperties().getProperty( Environment.PASS ));
|
|
||||||
|
|
||||||
BaseDataSource dataSource = new BaseDataSource() {
|
|
||||||
@Override
|
|
||||||
public Connection getConnection() throws SQLException {
|
|
||||||
return DriverManager.getConnection(url, connectionProps);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Connection getConnection(String username, String password) throws SQLException {
|
|
||||||
return DriverManager.getConnection(url, connectionProps);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
connectionProvider = new ConnectionProviderDecorator( dataSource );
|
|
||||||
config.put( AvailableSettings.CONNECTION_PROVIDER, connectionProvider );
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Class<?>[] getAnnotatedClasses() {
|
|
||||||
return new Class<?>[] {
|
|
||||||
Thing.class,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testConnectionAcquisitionCount() throws SQLException {
|
|
||||||
connectionProvider.clear();
|
|
||||||
|
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
|
||||||
assertEquals( 1, connectionProvider.getConnectionCount() );
|
|
||||||
Thing thing = new Thing();
|
|
||||||
thing.setId( 1 );
|
|
||||||
entityManager.persist( thing );
|
|
||||||
assertEquals( 1, connectionProvider.getConnectionCount() );
|
|
||||||
} );
|
|
||||||
|
|
||||||
assertEquals( 1, connectionProvider.getConnectionCount() );
|
|
||||||
verify( connectionProvider.connection, times( 1 ) ).close();
|
|
||||||
Mockito.reset( connectionProvider.connection );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Entity(name = "Thing")
|
|
||||||
@Table(name = "Thing")
|
|
||||||
public static class Thing {
|
|
||||||
@Id
|
|
||||||
public Integer id;
|
|
||||||
|
|
||||||
public Integer getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Integer id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ConnectionProviderDecorator extends UserSuppliedConnectionProviderImpl {
|
|
||||||
|
|
||||||
private final DataSource dataSource;
|
|
||||||
|
|
||||||
private int connectionCount;
|
|
||||||
|
|
||||||
private Connection connection;
|
|
||||||
|
|
||||||
public ConnectionProviderDecorator(DataSource dataSource) {
|
|
||||||
this.dataSource = dataSource;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Connection getConnection() throws SQLException {
|
|
||||||
connectionCount++;
|
|
||||||
connection = spy(dataSource.getConnection());
|
|
||||||
return connection;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void closeConnection(Connection connection) throws SQLException {
|
|
||||||
connection.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getConnectionCount() {
|
|
||||||
return this.connectionCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clear() {
|
|
||||||
connectionCount = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.testing.orm.junit;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Modifier;
|
||||||
|
import java.sql.Types;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public final class ExtraAssertions {
|
||||||
|
private ExtraAssertions() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void assertClassAssignability(Class expected, Class actual) {
|
||||||
|
if ( !expected.isAssignableFrom( actual ) ) {
|
||||||
|
fail( "Expected class [" + expected.getName() + "] was not assignable from actual [" + actual.getName() + "]" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <T> T assertTyping(Class<T> expectedType, Object value) {
|
||||||
|
if ( !expectedType.isInstance( value ) ) {
|
||||||
|
fail(
|
||||||
|
String.format(
|
||||||
|
"Expecting value of type [%s], but found [%s]",
|
||||||
|
expectedType.getName(),
|
||||||
|
value == null ? "<null>" : value
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return (T) value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void assertJdbcTypeCode(int expected, int actual) {
|
||||||
|
if ( expected != actual ) {
|
||||||
|
final String message = String.format(
|
||||||
|
"JDBC type codes did not match...\n" +
|
||||||
|
"Expected: %s (%s)\n" +
|
||||||
|
"Actual : %s (%s)",
|
||||||
|
jdbcTypeCodeMap().get( expected ),
|
||||||
|
expected,
|
||||||
|
jdbcTypeCodeMap().get( actual ),
|
||||||
|
actual
|
||||||
|
);
|
||||||
|
fail( message );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<Integer, String> jdbcTypeCodeMap;
|
||||||
|
|
||||||
|
private static synchronized Map<Integer, String> jdbcTypeCodeMap() {
|
||||||
|
if ( jdbcTypeCodeMap == null ) {
|
||||||
|
jdbcTypeCodeMap = generateJdbcTypeCache();
|
||||||
|
}
|
||||||
|
return jdbcTypeCodeMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map generateJdbcTypeCache() {
|
||||||
|
final Field[] fields = Types.class.getFields();
|
||||||
|
Map cache = new HashMap( (int) ( fields.length * .75 ) + 1 );
|
||||||
|
for ( Field field : fields ) {
|
||||||
|
if ( Modifier.isStatic( field.getModifiers() ) ) {
|
||||||
|
try {
|
||||||
|
cache.put( field.get( null ), field.getName() );
|
||||||
|
}
|
||||||
|
catch (Throwable ignore) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cache;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue