re-enable tests
re-organize some tests added `@LoggingInspections` added `@MessageKeyWatcher` account for various "odd" explicit Type mappings fix column read/write transformations
This commit is contained in:
parent
e4f1461e17
commit
a02835bdde
|
@ -7,17 +7,17 @@
|
||||||
package org.hibernate.boot.model;
|
package org.hibernate.boot.model;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.sql.Types;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import org.hibernate.NotYetImplementedFor6Exception;
|
|
||||||
import org.hibernate.boot.model.process.internal.UserTypeResolution;
|
import org.hibernate.boot.model.process.internal.UserTypeResolution;
|
||||||
import org.hibernate.boot.spi.MetadataBuildingContext;
|
import org.hibernate.boot.spi.MetadataBuildingContext;
|
||||||
import org.hibernate.internal.util.MutableInteger;
|
|
||||||
import org.hibernate.internal.util.collections.CollectionHelper;
|
import org.hibernate.internal.util.collections.CollectionHelper;
|
||||||
import org.hibernate.mapping.BasicValue;
|
import org.hibernate.mapping.BasicValue;
|
||||||
import org.hibernate.metamodel.mapping.JdbcMapping;
|
import org.hibernate.metamodel.mapping.JdbcMapping;
|
||||||
|
@ -26,11 +26,13 @@ import org.hibernate.resource.beans.spi.ManagedBean;
|
||||||
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
||||||
import org.hibernate.type.BasicType;
|
import org.hibernate.type.BasicType;
|
||||||
import org.hibernate.type.CustomType;
|
import org.hibernate.type.CustomType;
|
||||||
import org.hibernate.type.EnumType;
|
import org.hibernate.type.SerializableType;
|
||||||
|
import org.hibernate.type.Type;
|
||||||
import org.hibernate.type.descriptor.java.ImmutableMutabilityPlan;
|
import org.hibernate.type.descriptor.java.ImmutableMutabilityPlan;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.java.MutabilityPlan;
|
import org.hibernate.type.descriptor.java.MutabilityPlan;
|
||||||
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
|
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
|
||||||
|
import org.hibernate.type.descriptor.sql.SqlTypeDescriptorIndicators;
|
||||||
import org.hibernate.type.spi.TypeConfiguration;
|
import org.hibernate.type.spi.TypeConfiguration;
|
||||||
import org.hibernate.type.spi.TypeConfigurationAware;
|
import org.hibernate.type.spi.TypeConfigurationAware;
|
||||||
import org.hibernate.usertype.ParameterizedType;
|
import org.hibernate.usertype.ParameterizedType;
|
||||||
|
@ -59,7 +61,6 @@ public class TypeDefinition implements Serializable {
|
||||||
private final Class typeImplementorClass;
|
private final Class typeImplementorClass;
|
||||||
private final String[] registrationKeys;
|
private final String[] registrationKeys;
|
||||||
private final Properties parameters;
|
private final Properties parameters;
|
||||||
private final TypeConfiguration typeConfiguration;
|
|
||||||
|
|
||||||
private BasicValue.Resolution<?> reusableResolution;
|
private BasicValue.Resolution<?> reusableResolution;
|
||||||
|
|
||||||
|
@ -74,7 +75,6 @@ public class TypeDefinition implements Serializable {
|
||||||
this.typeImplementorClass = typeImplementorClass;
|
this.typeImplementorClass = typeImplementorClass;
|
||||||
this.registrationKeys= registrationKeys;
|
this.registrationKeys= registrationKeys;
|
||||||
this.parameters = parameters;
|
this.parameters = parameters;
|
||||||
this.typeConfiguration = typeConfiguration;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
|
@ -102,84 +102,94 @@ public class TypeDefinition implements Serializable {
|
||||||
public BasicValue.Resolution<?> resolve(
|
public BasicValue.Resolution<?> resolve(
|
||||||
Map localConfigParameters,
|
Map localConfigParameters,
|
||||||
MutabilityPlan explicitMutabilityPlan,
|
MutabilityPlan explicitMutabilityPlan,
|
||||||
MetadataBuildingContext context) {
|
MetadataBuildingContext context,
|
||||||
|
SqlTypeDescriptorIndicators indicators) {
|
||||||
if ( CollectionHelper.isEmpty( localConfigParameters ) ) {
|
if ( CollectionHelper.isEmpty( localConfigParameters ) ) {
|
||||||
// we can use the re-usable resolution...
|
// we can use the re-usable resolution...
|
||||||
if ( reusableResolution == null ) {
|
if ( reusableResolution == null ) {
|
||||||
final ManagedBean typeBean = context.getBootstrapContext()
|
reusableResolution = createResolution( null, Collections.emptyMap(), indicators, context );
|
||||||
.getServiceRegistry()
|
|
||||||
.getService( ManagedBeanRegistry.class )
|
|
||||||
.getBean( typeImplementorClass );
|
|
||||||
|
|
||||||
final Object typeInstance = typeBean.getBeanInstance();
|
|
||||||
|
|
||||||
injectParameters( typeInstance, () -> parameters );
|
|
||||||
|
|
||||||
reusableResolution = createReusableResolution( typeInstance, name, context );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return reusableResolution;
|
return reusableResolution;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
final String name = this.name + ":" + NAME_COUNTER.getAndIncrement();
|
final String name = this.name + ":" + NAME_COUNTER.getAndIncrement();
|
||||||
|
return createResolution( name, localConfigParameters, indicators, context );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final ManagedBean typeBean = context.getBootstrapContext()
|
private BasicValue.Resolution<?> createResolution(
|
||||||
.getServiceRegistry()
|
String name,
|
||||||
.getService( ManagedBeanRegistry.class )
|
Map<?,?> usageSiteProperties,
|
||||||
.getBean( name, typeImplementorClass );
|
SqlTypeDescriptorIndicators indicators,
|
||||||
|
MetadataBuildingContext context) {
|
||||||
final Object typeInstance = typeBean.getBeanInstance();
|
|
||||||
|
|
||||||
injectParameters(
|
|
||||||
typeInstance,
|
|
||||||
() -> mergeParameters( parameters, localConfigParameters )
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
return createResolution(
|
return createResolution(
|
||||||
name,
|
name,
|
||||||
typeInstance,
|
typeImplementorClass,
|
||||||
explicitMutabilityPlan,
|
parameters,
|
||||||
|
usageSiteProperties,
|
||||||
|
indicators,
|
||||||
context
|
context
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private static Properties mergeParameters(Properties parameters, Map localConfigParameters) {
|
private static BasicValue.Resolution<?> createResolution(
|
||||||
final Properties mergedParameters = new Properties();
|
|
||||||
|
|
||||||
if ( parameters != null ) {
|
|
||||||
mergedParameters.putAll( parameters );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( localConfigParameters != null && ! localConfigParameters.isEmpty() ) {
|
|
||||||
mergedParameters.putAll( localConfigParameters );
|
|
||||||
}
|
|
||||||
|
|
||||||
return mergedParameters;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void injectParameters(Object customType, Supplier<Properties> parameterSupplier) {
|
|
||||||
if ( customType instanceof ParameterizedType ) {
|
|
||||||
final Properties parameterValues = parameterSupplier.get();
|
|
||||||
if ( parameterValues != null ) {
|
|
||||||
( (ParameterizedType) customType ).setParameterValues( parameterValues );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static BasicValue.Resolution<?> createReusableResolution(
|
|
||||||
Object namedTypeInstance,
|
|
||||||
String name,
|
String name,
|
||||||
MetadataBuildingContext buildingContext) {
|
Class<?> typeImplementorClass,
|
||||||
if ( namedTypeInstance instanceof UserType ) {
|
Properties parameters,
|
||||||
final UserType userType = (UserType) namedTypeInstance;
|
Map<?,?> usageSiteProperties,
|
||||||
final CustomType customType = new CustomType( userType, buildingContext.getBootstrapContext().getTypeConfiguration() );
|
SqlTypeDescriptorIndicators indicators,
|
||||||
|
MetadataBuildingContext context) {
|
||||||
|
final TypeConfiguration typeConfiguration = context.getBootstrapContext().getTypeConfiguration();
|
||||||
|
|
||||||
|
final boolean isKnownType = Type.class.isAssignableFrom( typeImplementorClass )
|
||||||
|
|| UserType.class.isAssignableFrom( typeImplementorClass );
|
||||||
|
|
||||||
|
// support for AttributeConverter would be nice too
|
||||||
|
if ( isKnownType ) {
|
||||||
|
final ManagedBean typeBean;
|
||||||
|
if ( name != null ) {
|
||||||
|
typeBean = context.getBootstrapContext()
|
||||||
|
.getServiceRegistry()
|
||||||
|
.getService( ManagedBeanRegistry.class )
|
||||||
|
.getBean( name, typeImplementorClass );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
typeBean = context.getBootstrapContext()
|
||||||
|
.getServiceRegistry()
|
||||||
|
.getService( ManagedBeanRegistry.class )
|
||||||
|
.getBean( typeImplementorClass );
|
||||||
|
}
|
||||||
|
|
||||||
|
final Object typeInstance = typeBean.getBeanInstance();
|
||||||
|
|
||||||
|
if ( typeInstance instanceof TypeConfigurationAware ) {
|
||||||
|
( (TypeConfigurationAware) typeInstance ).setTypeConfiguration( typeConfiguration );
|
||||||
|
}
|
||||||
|
|
||||||
|
injectParameters(
|
||||||
|
typeInstance,
|
||||||
|
() -> {
|
||||||
|
if ( CollectionHelper.isNotEmpty( usageSiteProperties ) ) {
|
||||||
|
final Properties properties = new Properties( parameters );
|
||||||
|
properties.putAll( usageSiteProperties );
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if ( typeInstance instanceof UserType ) {
|
||||||
|
final UserType userType = (UserType) typeInstance;
|
||||||
|
final CustomType customType = new CustomType( userType, typeConfiguration );
|
||||||
|
|
||||||
return new UserTypeResolution( customType, null );
|
return new UserTypeResolution( customType, null );
|
||||||
}
|
}
|
||||||
else if ( namedTypeInstance instanceof BasicType ) {
|
|
||||||
final BasicType resolvedBasicType = (BasicType) namedTypeInstance;
|
if ( typeInstance instanceof BasicType ) {
|
||||||
|
final BasicType resolvedBasicType = (BasicType) typeInstance;
|
||||||
return new BasicValue.Resolution<Object>() {
|
return new BasicValue.Resolution<Object>() {
|
||||||
@Override
|
@Override
|
||||||
public JdbcMapping getJdbcMapping() {
|
public JdbcMapping getJdbcMapping() {
|
||||||
|
@ -220,12 +230,73 @@ public class TypeDefinition implements Serializable {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Series of backward compatible special cases
|
||||||
|
|
||||||
|
if ( Serializable.class.isAssignableFrom( typeImplementorClass ) ) {
|
||||||
|
final JavaTypeDescriptor<Serializable> jtd = typeConfiguration
|
||||||
|
.getJavaTypeDescriptorRegistry()
|
||||||
|
.resolveDescriptor( typeImplementorClass );
|
||||||
|
final SqlTypeDescriptor jdbcType = typeConfiguration.getSqlTypeDescriptorRegistry().getDescriptor( Types.VARBINARY );
|
||||||
|
final BasicType<Serializable> resolved = typeConfiguration.getBasicTypeRegistry().resolve( jtd, jdbcType );
|
||||||
|
final SerializableType legacyType = new SerializableType( typeImplementorClass );
|
||||||
|
|
||||||
|
return new BasicValue.Resolution<Object>() {
|
||||||
|
@Override
|
||||||
|
public JdbcMapping getJdbcMapping() {
|
||||||
|
return resolved;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BasicType getLegacyResolvedBasicType() {
|
||||||
|
return legacyType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JavaTypeDescriptor<Object> getDomainJavaDescriptor() {
|
||||||
|
return resolved.getMappedJavaTypeDescriptor();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JavaTypeDescriptor<?> getRelationalJavaDescriptor() {
|
||||||
|
return resolved.getMappedJavaTypeDescriptor();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SqlTypeDescriptor getRelationalSqlTypeDescriptor() {
|
||||||
|
return resolved.getSqlTypeDescriptor();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BasicValueConverter getValueConverter() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MutabilityPlan<Object> getMutabilityPlan() {
|
||||||
|
// a TypeDefinition does not explicitly provide a MutabilityPlan (yet?)
|
||||||
|
return resolved.isMutable()
|
||||||
|
? getDomainJavaDescriptor().getMutabilityPlan()
|
||||||
|
: ImmutableMutabilityPlan.instance();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
throw new IllegalArgumentException(
|
throw new IllegalArgumentException(
|
||||||
"Named type [" + namedTypeInstance + "] did not implement BasicType nor UserType"
|
"Named type [" + typeImplementorClass + "] did not implement BasicType nor UserType"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void injectParameters(Object customType, Supplier<Properties> parameterSupplier) {
|
||||||
|
if ( customType instanceof ParameterizedType ) {
|
||||||
|
final Properties parameterValues = parameterSupplier.get();
|
||||||
|
if ( parameterValues != null ) {
|
||||||
|
( (ParameterizedType) customType ).setParameterValues( parameterValues );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static BasicValue.Resolution<?> createLocalResolution(
|
public static BasicValue.Resolution<?> createLocalResolution(
|
||||||
String name,
|
String name,
|
||||||
Class typeImplementorClass,
|
Class typeImplementorClass,
|
||||||
|
@ -234,84 +305,21 @@ public class TypeDefinition implements Serializable {
|
||||||
MetadataBuildingContext buildingContext) {
|
MetadataBuildingContext buildingContext) {
|
||||||
name = name + ':' + NAME_COUNTER.getAndIncrement();
|
name = name + ':' + NAME_COUNTER.getAndIncrement();
|
||||||
|
|
||||||
final ManagedBean typeBean = buildingContext.getBootstrapContext()
|
final Properties properties = new Properties();
|
||||||
.getServiceRegistry()
|
properties.putAll( localTypeParams );
|
||||||
.getService( ManagedBeanRegistry.class )
|
|
||||||
.getBean( name, typeImplementorClass );
|
|
||||||
|
|
||||||
final Object typeInstance = typeBean.getBeanInstance();
|
final TypeConfiguration typeConfiguration = buildingContext.getBootstrapContext().getTypeConfiguration();
|
||||||
|
|
||||||
if ( typeInstance instanceof TypeConfigurationAware ) {
|
|
||||||
( (TypeConfigurationAware) typeInstance ).setTypeConfiguration( buildingContext.getBootstrapContext().getTypeConfiguration() );
|
|
||||||
}
|
|
||||||
|
|
||||||
injectParameters( typeInstance, () -> CollectionHelper.asProperties( localTypeParams ) );
|
|
||||||
|
|
||||||
return createResolution(
|
return createResolution(
|
||||||
name,
|
name,
|
||||||
typeInstance,
|
typeImplementorClass,
|
||||||
explicitMutabilityPlan,
|
properties,
|
||||||
|
null,
|
||||||
|
typeConfiguration.getCurrentBaseSqlTypeIndicators(),
|
||||||
buildingContext
|
buildingContext
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static BasicValue.Resolution<?> createResolution(
|
|
||||||
String name,
|
|
||||||
Object namedTypeInstance,
|
|
||||||
MutabilityPlan explicitMutabilityPlan,
|
|
||||||
MetadataBuildingContext metadataBuildingContext) {
|
|
||||||
if ( namedTypeInstance instanceof UserType ) {
|
|
||||||
return new UserTypeResolution(
|
|
||||||
new CustomType( (UserType) namedTypeInstance, metadataBuildingContext.getBootstrapContext().getTypeConfiguration() ),
|
|
||||||
null
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else if ( namedTypeInstance instanceof org.hibernate.type.BasicType ) {
|
|
||||||
final BasicType resolvedBasicType = (BasicType) namedTypeInstance;
|
|
||||||
return new BasicValue.Resolution<Object>() {
|
|
||||||
@Override
|
|
||||||
public JdbcMapping getJdbcMapping() {
|
|
||||||
return resolvedBasicType;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BasicType getLegacyResolvedBasicType() {
|
|
||||||
return resolvedBasicType;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JavaTypeDescriptor<Object> getDomainJavaDescriptor() {
|
|
||||||
return resolvedBasicType.getMappedJavaTypeDescriptor();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JavaTypeDescriptor<?> getRelationalJavaDescriptor() {
|
|
||||||
return resolvedBasicType.getMappedJavaTypeDescriptor();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SqlTypeDescriptor getRelationalSqlTypeDescriptor() {
|
|
||||||
return resolvedBasicType.getSqlTypeDescriptor();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BasicValueConverter getValueConverter() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public MutabilityPlan<Object> getMutabilityPlan() {
|
|
||||||
throw new NotYetImplementedFor6Exception( getClass() );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"Named type [" + name + " : " + namedTypeInstance
|
|
||||||
+ "] did not implement BasicType nor UserType"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if ( this == o ) {
|
if ( this == o ) {
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
* 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.boot.model.process.internal;
|
||||||
|
|
||||||
|
import org.hibernate.mapping.BasicValue;
|
||||||
|
import org.hibernate.metamodel.mapping.JdbcMapping;
|
||||||
|
import org.hibernate.metamodel.model.convert.spi.BasicValueConverter;
|
||||||
|
import org.hibernate.type.BasicType;
|
||||||
|
import org.hibernate.type.ConvertedBasicType;
|
||||||
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
|
import org.hibernate.type.descriptor.java.MutabilityPlan;
|
||||||
|
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
|
||||||
|
import org.hibernate.type.descriptor.sql.SqlTypeDescriptorIndicators;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public class ConvertedBasicTypeResolution<J> implements BasicValue.Resolution<J> {
|
||||||
|
private final ConvertedBasicType basicType;
|
||||||
|
private final ValueConverterTypeAdapter adapted;
|
||||||
|
|
||||||
|
public ConvertedBasicTypeResolution(
|
||||||
|
ConvertedBasicType basicType,
|
||||||
|
SqlTypeDescriptorIndicators stdIndicators) {
|
||||||
|
this.basicType = basicType;
|
||||||
|
|
||||||
|
final BasicValueConverter valueConverter = basicType.getValueConverter();
|
||||||
|
|
||||||
|
this.adapted = new ValueConverterTypeAdapter(
|
||||||
|
valueConverter.getClass().getTypeName(),
|
||||||
|
valueConverter,
|
||||||
|
stdIndicators
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BasicType<J> getLegacyResolvedBasicType() {
|
||||||
|
return adapted;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JdbcMapping getJdbcMapping() {
|
||||||
|
return adapted;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JavaTypeDescriptor<J> getDomainJavaDescriptor() {
|
||||||
|
return basicType.getValueConverter().getDomainJavaDescriptor();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JavaTypeDescriptor<?> getRelationalJavaDescriptor() {
|
||||||
|
return basicType.getValueConverter().getRelationalJavaDescriptor();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SqlTypeDescriptor getRelationalSqlTypeDescriptor() {
|
||||||
|
return adapted.getSqlTypeDescriptor();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BasicValueConverter getValueConverter() {
|
||||||
|
return basicType.getValueConverter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MutabilityPlan<J> getMutabilityPlan() {
|
||||||
|
return getDomainJavaDescriptor().getMutabilityPlan();
|
||||||
|
}
|
||||||
|
}
|
|
@ -41,9 +41,9 @@ public class NamedBasicTypeResolution<J> implements BasicValue.Resolution<J> {
|
||||||
this.basicType = basicType;
|
this.basicType = basicType;
|
||||||
|
|
||||||
// named type cannot have converter applied
|
// named type cannot have converter applied
|
||||||
this.valueConverter = null;
|
// this.valueConverter = null;
|
||||||
// todo (6.0) : does it even make sense to allow a combo of explicit Type and a converter?
|
// todo (6.0) : does it even make sense to allow a combo of explicit Type and a converter?
|
||||||
// this.valueConverter = valueConverter;
|
this.valueConverter = valueConverter;
|
||||||
|
|
||||||
final MutabilityPlan explicitPlan = explicitMutabilityPlanAccess != null
|
final MutabilityPlan explicitPlan = explicitMutabilityPlanAccess != null
|
||||||
? explicitMutabilityPlanAccess.apply( context.getBootstrapContext().getTypeConfiguration() )
|
? explicitMutabilityPlanAccess.apply( context.getBootstrapContext().getTypeConfiguration() )
|
||||||
|
@ -70,7 +70,9 @@ public class NamedBasicTypeResolution<J> implements BasicValue.Resolution<J> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JavaTypeDescriptor<?> getRelationalJavaDescriptor() {
|
public JavaTypeDescriptor<?> getRelationalJavaDescriptor() {
|
||||||
return basicType.getJavaTypeDescriptor();
|
return valueConverter == null
|
||||||
|
? basicType.getJavaTypeDescriptor()
|
||||||
|
: valueConverter.getRelationalJavaDescriptor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
/*
|
||||||
|
* 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.boot.model.process.internal;
|
||||||
|
|
||||||
|
import java.sql.CallableStatement;
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
||||||
|
import org.hibernate.metamodel.model.convert.spi.BasicValueConverter;
|
||||||
|
import org.hibernate.type.AbstractSingleColumnStandardBasicType;
|
||||||
|
import org.hibernate.type.descriptor.ValueBinder;
|
||||||
|
import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
|
import org.hibernate.type.descriptor.java.MutabilityPlan;
|
||||||
|
import org.hibernate.type.descriptor.sql.SqlTypeDescriptorIndicators;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public class ValueConverterTypeAdapter<J> extends AbstractSingleColumnStandardBasicType<J> {
|
||||||
|
private final String description;
|
||||||
|
private final BasicValueConverter<J,?> converter;
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
private final ValueBinder valueBinder;
|
||||||
|
|
||||||
|
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||||
|
public ValueConverterTypeAdapter(
|
||||||
|
String description,
|
||||||
|
BasicValueConverter<J, ?> converter,
|
||||||
|
SqlTypeDescriptorIndicators indicators) {
|
||||||
|
super(
|
||||||
|
converter.getRelationalJavaDescriptor().getJdbcRecommendedSqlType( indicators ),
|
||||||
|
(JavaTypeDescriptor) converter.getRelationalJavaDescriptor()
|
||||||
|
);
|
||||||
|
|
||||||
|
this.description = description;
|
||||||
|
this.converter = converter;
|
||||||
|
|
||||||
|
this.valueBinder = getSqlTypeDescriptor().getBinder( converter.getRelationalJavaDescriptor() );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return converter.getClass().getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings({ "unchecked" })
|
||||||
|
public void nullSafeSet(
|
||||||
|
CallableStatement st,
|
||||||
|
Object value,
|
||||||
|
String name,
|
||||||
|
SharedSessionContractImplementor session) throws SQLException {
|
||||||
|
final Object converted = converter.toRelationalValue( (J) value );
|
||||||
|
valueBinder.bind( st, converted, name, session );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings({ "unchecked" })
|
||||||
|
protected void nullSafeSet(PreparedStatement st, Object value, int index, WrapperOptions options) throws SQLException {
|
||||||
|
final Object converted = converter.toRelationalValue( (J) value );
|
||||||
|
valueBinder.bind( st, converted, index, options );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected MutabilityPlan<J> getMutabilityPlan() {
|
||||||
|
return converter.getDomainJavaDescriptor().getMutabilityPlan();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEqual(Object one, Object another) {
|
||||||
|
//noinspection unchecked
|
||||||
|
return ( (JavaTypeDescriptor<Object>) converter.getDomainJavaDescriptor() ).areEqual( one, another );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
}
|
|
@ -2459,7 +2459,8 @@ public class ModelBinder {
|
||||||
final BasicValue.Resolution<?> resolution = typeDefinition.resolve(
|
final BasicValue.Resolution<?> resolution = typeDefinition.resolve(
|
||||||
parameters,
|
parameters,
|
||||||
null,
|
null,
|
||||||
metadataBuildingContext
|
metadataBuildingContext,
|
||||||
|
bootstrapContext.getTypeConfiguration().getCurrentBaseSqlTypeIndicators()
|
||||||
);
|
);
|
||||||
|
|
||||||
return (DiscriminatorType<?>) resolution.getLegacyResolvedBasicType();
|
return (DiscriminatorType<?>) resolution.getLegacyResolvedBasicType();
|
||||||
|
|
|
@ -52,7 +52,7 @@ class SingularIdentifierAttributeSourceImpl
|
||||||
|
|
||||||
if ( StringHelper.isEmpty( idElement.getName() ) ) {
|
if ( StringHelper.isEmpty( idElement.getName() ) ) {
|
||||||
DeprecationLogger.DEPRECATION_LOGGER.logDeprecationOfNonNamedIdAttribute( container.getAttributeRoleBase().getFullPath() );
|
DeprecationLogger.DEPRECATION_LOGGER.logDeprecationOfNonNamedIdAttribute( container.getAttributeRoleBase().getFullPath() );
|
||||||
name = null;
|
name = "id";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
name = idElement.getName();
|
name = idElement.getName();
|
||||||
|
|
|
@ -17,6 +17,7 @@ import org.hibernate.boot.model.TypeDefinition;
|
||||||
import org.hibernate.boot.model.convert.internal.ClassBasedConverterDescriptor;
|
import org.hibernate.boot.model.convert.internal.ClassBasedConverterDescriptor;
|
||||||
import org.hibernate.boot.model.convert.spi.ConverterDescriptor;
|
import org.hibernate.boot.model.convert.spi.ConverterDescriptor;
|
||||||
import org.hibernate.boot.model.convert.spi.JpaAttributeConverterCreationContext;
|
import org.hibernate.boot.model.convert.spi.JpaAttributeConverterCreationContext;
|
||||||
|
import org.hibernate.boot.model.process.internal.ConvertedBasicTypeResolution;
|
||||||
import org.hibernate.boot.model.process.internal.InferredBasicValueResolver;
|
import org.hibernate.boot.model.process.internal.InferredBasicValueResolver;
|
||||||
import org.hibernate.boot.model.process.internal.NamedBasicTypeResolution;
|
import org.hibernate.boot.model.process.internal.NamedBasicTypeResolution;
|
||||||
import org.hibernate.boot.model.process.internal.NamedConverterResolution;
|
import org.hibernate.boot.model.process.internal.NamedConverterResolution;
|
||||||
|
@ -36,6 +37,7 @@ import org.hibernate.metamodel.model.convert.spi.BasicValueConverter;
|
||||||
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
||||||
import org.hibernate.service.ServiceRegistry;
|
import org.hibernate.service.ServiceRegistry;
|
||||||
import org.hibernate.type.BasicType;
|
import org.hibernate.type.BasicType;
|
||||||
|
import org.hibernate.type.ConvertedBasicType;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
import org.hibernate.type.descriptor.java.BasicJavaDescriptor;
|
import org.hibernate.type.descriptor.java.BasicJavaDescriptor;
|
||||||
import org.hibernate.type.descriptor.java.EnumJavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.EnumJavaTypeDescriptor;
|
||||||
|
@ -365,7 +367,12 @@ public class BasicValue extends SimpleValue implements SqlTypeDescriptorIndicato
|
||||||
.resolveAutoApplied( (BasicJavaDescriptor<?>) jtd );
|
.resolveAutoApplied( (BasicJavaDescriptor<?>) jtd );
|
||||||
if ( autoAppliedTypeDef != null ) {
|
if ( autoAppliedTypeDef != null ) {
|
||||||
log.debug( "BasicValue resolution matched auto-applied type-definition" );
|
log.debug( "BasicValue resolution matched auto-applied type-definition" );
|
||||||
return autoAppliedTypeDef.resolve( getTypeParameters(), null, getBuildingContext() );
|
return autoAppliedTypeDef.resolve(
|
||||||
|
getTypeParameters(),
|
||||||
|
null,
|
||||||
|
getBuildingContext(),
|
||||||
|
this
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( jtd instanceof EnumJavaTypeDescriptor ) {
|
if ( jtd instanceof EnumJavaTypeDescriptor ) {
|
||||||
|
@ -483,14 +490,18 @@ public class BasicValue extends SimpleValue implements SqlTypeDescriptorIndicato
|
||||||
if ( basicTypeByName != null ) {
|
if ( basicTypeByName != null ) {
|
||||||
final BasicValueConverter valueConverter;
|
final BasicValueConverter valueConverter;
|
||||||
final JavaTypeDescriptor<?> domainJtd;
|
final JavaTypeDescriptor<?> domainJtd;
|
||||||
if ( converterDescriptor == null ) {
|
if ( converterDescriptor != null ) {
|
||||||
valueConverter = null;
|
|
||||||
domainJtd = basicTypeByName.getJavaTypeDescriptor();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
valueConverter = converterDescriptor.createJpaAttributeConverter( converterCreationContext );
|
valueConverter = converterDescriptor.createJpaAttributeConverter( converterCreationContext );
|
||||||
domainJtd = valueConverter.getDomainJavaDescriptor();
|
domainJtd = valueConverter.getDomainJavaDescriptor();
|
||||||
}
|
}
|
||||||
|
else if ( basicTypeByName instanceof ConvertedBasicType ) {
|
||||||
|
final ConvertedBasicType convertedType = (ConvertedBasicType) basicTypeByName;
|
||||||
|
return new ConvertedBasicTypeResolution( convertedType, stdIndicators );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
valueConverter = null;
|
||||||
|
domainJtd = basicTypeByName.getJavaTypeDescriptor();
|
||||||
|
}
|
||||||
|
|
||||||
return new NamedBasicTypeResolution(
|
return new NamedBasicTypeResolution(
|
||||||
domainJtd,
|
domainJtd,
|
||||||
|
@ -509,7 +520,8 @@ public class BasicValue extends SimpleValue implements SqlTypeDescriptorIndicato
|
||||||
explicitMutabilityPlanAccess != null
|
explicitMutabilityPlanAccess != null
|
||||||
? explicitMutabilityPlanAccess.apply( typeConfiguration )
|
? explicitMutabilityPlanAccess.apply( typeConfiguration )
|
||||||
: null,
|
: null,
|
||||||
context
|
context,
|
||||||
|
stdIndicators
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -535,7 +547,8 @@ public class BasicValue extends SimpleValue implements SqlTypeDescriptorIndicato
|
||||||
explicitMutabilityPlanAccess != null
|
explicitMutabilityPlanAccess != null
|
||||||
? explicitMutabilityPlanAccess.apply( typeConfiguration )
|
? explicitMutabilityPlanAccess.apply( typeConfiguration )
|
||||||
: null,
|
: null,
|
||||||
context
|
context,
|
||||||
|
stdIndicators
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -108,7 +108,9 @@ public class StandardPojoEntityRepresentationStrategy implements EntityRepresent
|
||||||
|
|
||||||
final KeyValue bootDescriptorIdentifier = bootDescriptor.getIdentifier();
|
final KeyValue bootDescriptorIdentifier = bootDescriptor.getIdentifier();
|
||||||
|
|
||||||
if ( bootDescriptorIdentifier != null && bootDescriptorIdentifier instanceof Component ) {
|
if ( bootDescriptorIdentifier instanceof Component ) {
|
||||||
|
final Component component = (Component) bootDescriptorIdentifier;
|
||||||
|
if ( bootDescriptor.getIdentifierMapper() != null ) {
|
||||||
mapsIdRepresentationStrategy = new StandardPojoEmbeddableRepresentationStrategy(
|
mapsIdRepresentationStrategy = new StandardPojoEmbeddableRepresentationStrategy(
|
||||||
bootDescriptor.getIdentifierMapper(),
|
bootDescriptor.getIdentifierMapper(),
|
||||||
creationContext
|
creationContext
|
||||||
|
@ -118,6 +120,10 @@ public class StandardPojoEntityRepresentationStrategy implements EntityRepresent
|
||||||
mapsIdRepresentationStrategy = null;
|
mapsIdRepresentationStrategy = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
mapsIdRepresentationStrategy = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
mapsIdRepresentationStrategy = null;
|
mapsIdRepresentationStrategy = null;
|
||||||
identifierPropertyName = identifierProperty.getName();
|
identifierPropertyName = identifierProperty.getName();
|
||||||
|
@ -408,6 +414,11 @@ public class StandardPojoEntityRepresentationStrategy implements EntityRepresent
|
||||||
if ( propertyAccess != null ) {
|
if ( propertyAccess != null ) {
|
||||||
return propertyAccess;
|
return propertyAccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( mapsIdRepresentationStrategy != null ) {
|
||||||
return mapsIdRepresentationStrategy.resolvePropertyAccess( bootAttributeDescriptor );
|
return mapsIdRepresentationStrategy.resolvePropertyAccess( bootAttributeDescriptor );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@ import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.property.access.spi.PropertyAccess;
|
import org.hibernate.property.access.spi.PropertyAccess;
|
||||||
import org.hibernate.query.NavigablePath;
|
import org.hibernate.query.NavigablePath;
|
||||||
|
import org.hibernate.sql.Template;
|
||||||
import org.hibernate.sql.ast.Clause;
|
import org.hibernate.sql.ast.Clause;
|
||||||
import org.hibernate.sql.ast.tree.from.TableGroup;
|
import org.hibernate.sql.ast.tree.from.TableGroup;
|
||||||
import org.hibernate.sql.results.graph.DomainResult;
|
import org.hibernate.sql.results.graph.DomainResult;
|
||||||
|
@ -225,7 +226,7 @@ public class EmbeddableMappingType implements ManagedMappingType, SelectionMappi
|
||||||
containingTableExpression,
|
containingTableExpression,
|
||||||
columnExpression,
|
columnExpression,
|
||||||
selectable.isFormula(),
|
selectable.isFormula(),
|
||||||
selectable.getCustomReadExpression(),
|
selectable.getTemplate( dialect, sessionFactory.getQueryEngine().getSqmFunctionRegistry() ),
|
||||||
selectable.getCustomWriteExpression(),
|
selectable.getCustomWriteExpression(),
|
||||||
representationStrategy.resolvePropertyAccess( bootPropertyDescriptor ),
|
representationStrategy.resolvePropertyAccess( bootPropertyDescriptor ),
|
||||||
compositeType.getCascadeStyle( attributeIndex ),
|
compositeType.getCascadeStyle( attributeIndex ),
|
||||||
|
|
|
@ -193,6 +193,10 @@ public interface EntityMappingType extends ManagedMappingType, EntityValuedModel
|
||||||
return superMappingType.getRootEntityDescriptor();
|
return superMappingType.getRootEntityDescriptor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default TableReference locateTableReference(TableGroup tableGroup) {
|
||||||
|
return tableGroup.getPrimaryTableReference();
|
||||||
|
}
|
||||||
|
|
||||||
interface ConstraintOrderedTableConsumer {
|
interface ConstraintOrderedTableConsumer {
|
||||||
void consume(String tableExpression, Supplier<Consumer<SelectionConsumer>> tableKeyColumnVisitationSupplier);
|
void consume(String tableExpression, Supplier<Consumer<SelectionConsumer>> tableKeyColumnVisitationSupplier);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,10 @@ import org.hibernate.sql.results.graph.DomainResultCreationState;
|
||||||
public interface ForeignKeyDescriptor extends VirtualModelPart {
|
public interface ForeignKeyDescriptor extends VirtualModelPart {
|
||||||
String PART_NAME = "{fk}";
|
String PART_NAME = "{fk}";
|
||||||
|
|
||||||
|
String getKeyColumnContainingTable();
|
||||||
|
|
||||||
|
String getTargetColumnContainingTable();
|
||||||
|
|
||||||
DomainResult createCollectionFetchDomainResult(
|
DomainResult createCollectionFetchDomainResult(
|
||||||
NavigablePath collectionPath,
|
NavigablePath collectionPath,
|
||||||
TableGroup tableGroup,
|
TableGroup tableGroup,
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.metamodel.mapping;
|
package org.hibernate.metamodel.mapping;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.function.BiConsumer;
|
import java.util.function.BiConsumer;
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,16 @@ public class EmbeddedForeignKeyDescriptor implements ForeignKeyDescriptor, Model
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getKeyColumnContainingTable() {
|
||||||
|
return keyColumnContainingTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTargetColumnContainingTable() {
|
||||||
|
return targetColumnContainingTable;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DomainResult createCollectionFetchDomainResult(
|
public DomainResult createCollectionFetchDomainResult(
|
||||||
NavigablePath collectionPath,
|
NavigablePath collectionPath,
|
||||||
|
|
|
@ -7,21 +7,19 @@
|
||||||
package org.hibernate.metamodel.mapping.internal;
|
package org.hibernate.metamodel.mapping.internal;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.hibernate.dialect.Dialect;
|
import org.hibernate.dialect.Dialect;
|
||||||
import org.hibernate.engine.spi.Mapping;
|
import org.hibernate.engine.spi.Mapping;
|
||||||
import org.hibernate.internal.util.collections.ArrayHelper;
|
|
||||||
import org.hibernate.internal.util.collections.CollectionHelper;
|
import org.hibernate.internal.util.collections.CollectionHelper;
|
||||||
import org.hibernate.mapping.Selectable;
|
import org.hibernate.mapping.Selectable;
|
||||||
import org.hibernate.mapping.Value;
|
import org.hibernate.mapping.Value;
|
||||||
|
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
|
||||||
|
import org.hibernate.metamodel.mapping.JdbcMapping;
|
||||||
import org.hibernate.metamodel.mapping.SelectionConsumer;
|
import org.hibernate.metamodel.mapping.SelectionConsumer;
|
||||||
import org.hibernate.metamodel.mapping.SelectionMapping;
|
import org.hibernate.metamodel.mapping.SelectionMapping;
|
||||||
import org.hibernate.metamodel.mapping.SelectionMappings;
|
import org.hibernate.metamodel.mapping.SelectionMappings;
|
||||||
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
|
|
||||||
import org.hibernate.metamodel.mapping.JdbcMapping;
|
|
||||||
import org.hibernate.query.sqm.function.SqmFunctionRegistry;
|
import org.hibernate.query.sqm.function.SqmFunctionRegistry;
|
||||||
import org.hibernate.type.CompositeType;
|
import org.hibernate.type.CompositeType;
|
||||||
import org.hibernate.type.EntityType;
|
import org.hibernate.type.EntityType;
|
||||||
|
|
|
@ -68,6 +68,16 @@ public class SimpleForeignKeyDescriptor implements ForeignKeyDescriptor, BasicVa
|
||||||
this.refersToPrimaryKey = refersToPrimaryKey;
|
this.refersToPrimaryKey = refersToPrimaryKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getKeyColumnContainingTable() {
|
||||||
|
return keySelectionMapping.getContainingTableExpression();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTargetColumnContainingTable() {
|
||||||
|
return targetSelectionMapping.getContainingTableExpression();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DomainResult<?> createCollectionFetchDomainResult(
|
public DomainResult<?> createCollectionFetchDomainResult(
|
||||||
NavigablePath collectionPath,
|
NavigablePath collectionPath,
|
||||||
|
|
|
@ -6,26 +6,24 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.metamodel.mapping.ordering.ast;
|
package org.hibernate.metamodel.mapping.ordering.ast;
|
||||||
|
|
||||||
import org.hibernate.query.SortOrder;
|
|
||||||
import org.hibernate.metamodel.mapping.MappingType;
|
import org.hibernate.metamodel.mapping.MappingType;
|
||||||
import org.hibernate.metamodel.mapping.ModelPartContainer;
|
import org.hibernate.metamodel.mapping.ModelPartContainer;
|
||||||
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
|
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
|
||||||
import org.hibernate.metamodel.mapping.ordering.TranslationContext;
|
import org.hibernate.metamodel.mapping.ordering.TranslationContext;
|
||||||
import org.hibernate.persister.entity.AbstractEntityPersister;
|
import org.hibernate.persister.entity.AbstractEntityPersister;
|
||||||
import org.hibernate.query.NavigablePath;
|
import org.hibernate.query.NavigablePath;
|
||||||
|
import org.hibernate.query.SortOrder;
|
||||||
import org.hibernate.sql.ast.spi.SqlAstCreationState;
|
import org.hibernate.sql.ast.spi.SqlAstCreationState;
|
||||||
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
|
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
|
||||||
import org.hibernate.sql.ast.tree.expression.Expression;
|
import org.hibernate.sql.ast.tree.expression.Expression;
|
||||||
import org.hibernate.sql.ast.tree.from.TableGroup;
|
import org.hibernate.sql.ast.tree.from.TableGroup;
|
||||||
import org.hibernate.sql.ast.tree.from.TableReference;
|
import org.hibernate.sql.ast.tree.from.TableReference;
|
||||||
import org.hibernate.sql.ast.tree.from.TableReferenceJoin;
|
|
||||||
import org.hibernate.sql.ast.tree.select.QuerySpec;
|
import org.hibernate.sql.ast.tree.select.QuerySpec;
|
||||||
import org.hibernate.sql.ast.tree.select.SortSpecification;
|
import org.hibernate.sql.ast.tree.select.SortSpecification;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a column-reference used in an order-by fragment
|
* Represents a column-reference used in an order-by fragment
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
|
||||||
* @apiNote This is Hibernate-specific feature. For {@link javax.persistence.OrderBy} (JPA)
|
* @apiNote This is Hibernate-specific feature. For {@link javax.persistence.OrderBy} (JPA)
|
||||||
* all path references are expected to be domain paths (attributes).
|
* all path references are expected to be domain paths (attributes).
|
||||||
*
|
*
|
||||||
|
@ -101,19 +99,15 @@ public class ColumnReference implements OrderingExpression, SequencePart {
|
||||||
TableReference getTableReference(TableGroup tableGroup) {
|
TableReference getTableReference(TableGroup tableGroup) {
|
||||||
ModelPartContainer modelPart = tableGroup.getModelPart();
|
ModelPartContainer modelPart = tableGroup.getModelPart();
|
||||||
if ( modelPart instanceof PluralAttributeMapping ) {
|
if ( modelPart instanceof PluralAttributeMapping ) {
|
||||||
MappingType partMappingType = ( (PluralAttributeMapping) modelPart ).getElementDescriptor()
|
final PluralAttributeMapping pluralAttribute = (PluralAttributeMapping) modelPart;
|
||||||
.getPartMappingType();
|
final MappingType elementMappingType = (pluralAttribute).getElementDescriptor().getPartMappingType();
|
||||||
if ( partMappingType instanceof AbstractEntityPersister ) {
|
|
||||||
AbstractEntityPersister abstractEntityPersister = (AbstractEntityPersister) partMappingType;
|
if ( elementMappingType instanceof AbstractEntityPersister ) {
|
||||||
int i = abstractEntityPersister.determineTableNumberForColumn( columnExpression );
|
final AbstractEntityPersister abstractEntityPersister = (AbstractEntityPersister) elementMappingType;
|
||||||
String tableName = abstractEntityPersister.getTableName( i );
|
final int tableNumber = abstractEntityPersister.determineTableNumberForColumn( columnExpression );
|
||||||
for ( TableReferenceJoin tableReferenceJoin : tableGroup.getTableReferenceJoins() ) {
|
final String tableName = abstractEntityPersister.getTableName( tableNumber );
|
||||||
final TableReference joinedTableReference = tableReferenceJoin.getJoinedTableReference();
|
|
||||||
if ( joinedTableReference.getTableExpression()
|
return tableGroup.getTableReference( tableName );
|
||||||
.equals( tableName ) ) {
|
|
||||||
return joinedTableReference;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return tableGroup.getPrimaryTableReference();
|
return tableGroup.getPrimaryTableReference();
|
||||||
|
|
|
@ -247,6 +247,7 @@ import org.hibernate.type.TypeHelper;
|
||||||
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.hibernate.type.descriptor.java.MutabilityPlan;
|
import org.hibernate.type.descriptor.java.MutabilityPlan;
|
||||||
|
import org.hibernate.type.spi.TypeConfiguration;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Basic functionality for persisting an entity via JDBC
|
* Basic functionality for persisting an entity via JDBC
|
||||||
|
@ -1405,7 +1406,7 @@ public abstract class AbstractEntityPersister
|
||||||
generateJoinPredicate(
|
generateJoinPredicate(
|
||||||
primaryTableReference,
|
primaryTableReference,
|
||||||
joinedTableReference,
|
joinedTableReference,
|
||||||
i,
|
getSubclassTableKeyColumns( i ),
|
||||||
sqlExpressionResolver
|
sqlExpressionResolver
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
@ -1426,6 +1427,7 @@ public abstract class AbstractEntityPersister
|
||||||
return resolvePrimaryTableReference( sqlAliasBase );
|
return resolvePrimaryTableReference( sqlAliasBase );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TableReferenceJoin createTableReferenceJoin(
|
public TableReferenceJoin createTableReferenceJoin(
|
||||||
String joinTableExpression,
|
String joinTableExpression,
|
||||||
|
@ -1437,22 +1439,13 @@ public abstract class AbstractEntityPersister
|
||||||
for ( int i = 1; i < getSubclassTableSpan(); i++ ) {
|
for ( int i = 1; i < getSubclassTableSpan(); i++ ) {
|
||||||
final String subclassTableName = getSubclassTableName( i );
|
final String subclassTableName = getSubclassTableName( i );
|
||||||
if ( subclassTableName.equals( joinTableExpression ) ) {
|
if ( subclassTableName.equals( joinTableExpression ) ) {
|
||||||
final TableReference joinedTableReference = new TableReference(
|
return generateTableReferenceJoin(
|
||||||
joinTableExpression,
|
|
||||||
sqlAliasBase.generateNewAlias(),
|
|
||||||
isNullableSubclassTable( i ),
|
|
||||||
getFactory()
|
|
||||||
);
|
|
||||||
|
|
||||||
return new TableReferenceJoin(
|
|
||||||
determineSubclassTableJoinType( i, canUseInnerJoin, true, Collections.emptySet() ),
|
|
||||||
joinedTableReference,
|
|
||||||
generateJoinPredicate(
|
|
||||||
lhs,
|
lhs,
|
||||||
joinedTableReference,
|
joinTableExpression,
|
||||||
i,
|
sqlAliasBase,
|
||||||
|
determineSubclassTableJoinType( i, canUseInnerJoin, true, Collections.emptySet() ),
|
||||||
|
getSubclassTableKeyColumns( i ),
|
||||||
sqlExpressionResolver
|
sqlExpressionResolver
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1460,6 +1453,32 @@ public abstract class AbstractEntityPersister
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected TableReferenceJoin generateTableReferenceJoin(
|
||||||
|
TableReference lhs,
|
||||||
|
String joinTableExpression,
|
||||||
|
SqlAliasBase sqlAliasBase,
|
||||||
|
SqlAstJoinType joinType,
|
||||||
|
String[] targetColumns,
|
||||||
|
SqlExpressionResolver sqlExpressionResolver) {
|
||||||
|
final TableReference joinedTableReference = new TableReference(
|
||||||
|
joinTableExpression,
|
||||||
|
sqlAliasBase.generateNewAlias(),
|
||||||
|
joinType != SqlAstJoinType.INNER,
|
||||||
|
getFactory()
|
||||||
|
);
|
||||||
|
|
||||||
|
return new TableReferenceJoin(
|
||||||
|
joinType,
|
||||||
|
joinedTableReference,
|
||||||
|
generateJoinPredicate(
|
||||||
|
lhs,
|
||||||
|
joinedTableReference,
|
||||||
|
targetColumns,
|
||||||
|
sqlExpressionResolver
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
protected TableReference resolvePrimaryTableReference(SqlAliasBase sqlAliasBase) {
|
protected TableReference resolvePrimaryTableReference(SqlAliasBase sqlAliasBase) {
|
||||||
return new TableReference(
|
return new TableReference(
|
||||||
getTableName(),
|
getTableName(),
|
||||||
|
@ -1472,14 +1491,13 @@ public abstract class AbstractEntityPersister
|
||||||
protected Predicate generateJoinPredicate(
|
protected Predicate generateJoinPredicate(
|
||||||
TableReference rootTableReference,
|
TableReference rootTableReference,
|
||||||
TableReference joinedTableReference,
|
TableReference joinedTableReference,
|
||||||
int subClassTablePosition,
|
String[] fkColumnNames,
|
||||||
SqlExpressionResolver sqlExpressionResolver) {
|
SqlExpressionResolver sqlExpressionResolver) {
|
||||||
final EntityIdentifierMapping identifierMapping = getIdentifierMapping();
|
final EntityIdentifierMapping identifierMapping = getIdentifierMapping();
|
||||||
|
|
||||||
final Junction conjunction = new Junction( Junction.Nature.CONJUNCTION );
|
final Junction conjunction = new Junction( Junction.Nature.CONJUNCTION );
|
||||||
|
|
||||||
final String[] rootPkColumnNames = getKeyColumnNames();
|
final String[] rootPkColumnNames = getKeyColumnNames();
|
||||||
final String[] fkColumnNames = getSubclassTableKeyColumns( subClassTablePosition );
|
|
||||||
|
|
||||||
assert rootPkColumnNames.length == fkColumnNames.length;
|
assert rootPkColumnNames.length == fkColumnNames.length;
|
||||||
assert rootPkColumnNames.length == identifierMapping.getJdbcTypeCount();
|
assert rootPkColumnNames.length == identifierMapping.getJdbcTypeCount();
|
||||||
|
@ -1523,6 +1541,19 @@ public abstract class AbstractEntityPersister
|
||||||
return conjunction;
|
return conjunction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected Predicate generateJoinPredicate(
|
||||||
|
TableReference rootTableReference,
|
||||||
|
TableReference joinedTableReference,
|
||||||
|
int subClassTablePosition,
|
||||||
|
SqlExpressionResolver sqlExpressionResolver) {
|
||||||
|
return generateJoinPredicate(
|
||||||
|
rootTableReference,
|
||||||
|
joinedTableReference,
|
||||||
|
getSubclassTableKeyColumns( subClassTablePosition ),
|
||||||
|
sqlExpressionResolver
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public Object initializeLazyProperty(String fieldName, Object entity, SharedSessionContractImplementor session) {
|
public Object initializeLazyProperty(String fieldName, Object entity, SharedSessionContractImplementor session) {
|
||||||
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
|
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
|
||||||
final EntityEntry entry = persistenceContext.getEntry( entity );
|
final EntityEntry entry = persistenceContext.getEntry( entity );
|
||||||
|
@ -6393,8 +6424,11 @@ public abstract class AbstractEntityPersister
|
||||||
Property bootProperty,
|
Property bootProperty,
|
||||||
int stateArrayPosition,
|
int stateArrayPosition,
|
||||||
MappingModelCreationProcess creationProcess) {
|
MappingModelCreationProcess creationProcess) {
|
||||||
|
|
||||||
final SessionFactoryImplementor sessionFactory = creationProcess.getCreationContext().getSessionFactory();
|
final SessionFactoryImplementor sessionFactory = creationProcess.getCreationContext().getSessionFactory();
|
||||||
|
final TypeConfiguration typeConfiguration = sessionFactory.getTypeConfiguration();
|
||||||
|
final JdbcServices jdbcServices = sessionFactory.getJdbcServices();
|
||||||
|
final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment();
|
||||||
|
final Dialect dialect = jdbcEnvironment.getDialect();
|
||||||
|
|
||||||
final String attrName = tupleAttrDefinition.getName();
|
final String attrName = tupleAttrDefinition.getName();
|
||||||
final Type attrType = tupleAttrDefinition.getType();
|
final Type attrType = tupleAttrDefinition.getType();
|
||||||
|
@ -6452,7 +6486,7 @@ public abstract class AbstractEntityPersister
|
||||||
|
|
||||||
assert attrColumnExpression.equals( selectable.getText( sessionFactory.getDialect() ) );
|
assert attrColumnExpression.equals( selectable.getText( sessionFactory.getDialect() ) );
|
||||||
|
|
||||||
customReadExpr = selectable.getCustomReadExpression();
|
customReadExpr = selectable.getTemplate( dialect, sessionFactory.getQueryEngine().getSqmFunctionRegistry() );
|
||||||
customWriteExpr = selectable.getCustomWriteExpression();
|
customWriteExpr = selectable.getCustomWriteExpression();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -3922,6 +3922,12 @@ public class SemanticQueryBuilder<R> extends HqlParserBaseVisitor<Object> implem
|
||||||
|
|
||||||
try {
|
try {
|
||||||
queryExpressionContext.accept( this );
|
queryExpressionContext.accept( this );
|
||||||
|
|
||||||
|
final List<SqmSelection> selections = subQuery.getQuerySpec().getSelectClause().getSelections();
|
||||||
|
if ( selections.size() == 1 ) {
|
||||||
|
subQuery.applyInferableType( selections.get( 0 ).getNodeType() );
|
||||||
|
}
|
||||||
|
|
||||||
return subQuery;
|
return subQuery;
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
|
|
|
@ -136,8 +136,13 @@ public class QueryParameterBindingsImpl implements QueryParameterBindings {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <P> QueryParameterBinding<P> getBinding(String name) {
|
public <P> QueryParameterBinding<P> getBinding(String name) {
|
||||||
|
final QueryParameterImplementor<?> parameter = parameterMetadata.getQueryParameter( name );
|
||||||
|
if ( parameter == null ) {
|
||||||
|
throw new IllegalArgumentException( "Parameter does not exist: " + name );
|
||||||
|
}
|
||||||
|
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
return (QueryParameterBinding<P>) getBinding( parameterMetadata.getQueryParameter( name ) );
|
return (QueryParameterBinding<P>) getBinding( parameter );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.hibernate.HibernateException;
|
||||||
import org.hibernate.LockMode;
|
import org.hibernate.LockMode;
|
||||||
import org.hibernate.LockOptions;
|
import org.hibernate.LockOptions;
|
||||||
import org.hibernate.NotYetImplementedFor6Exception;
|
import org.hibernate.NotYetImplementedFor6Exception;
|
||||||
|
import org.hibernate.QueryException;
|
||||||
import org.hibernate.boot.model.process.internal.InferredBasicValueResolver;
|
import org.hibernate.boot.model.process.internal.InferredBasicValueResolver;
|
||||||
import org.hibernate.dialect.function.TimestampaddFunction;
|
import org.hibernate.dialect.function.TimestampaddFunction;
|
||||||
import org.hibernate.dialect.function.TimestampdiffFunction;
|
import org.hibernate.dialect.function.TimestampdiffFunction;
|
||||||
|
@ -54,6 +55,7 @@ import org.hibernate.metamodel.mapping.MappingModelExpressable;
|
||||||
import org.hibernate.metamodel.mapping.ModelPart;
|
import org.hibernate.metamodel.mapping.ModelPart;
|
||||||
import org.hibernate.metamodel.mapping.ModelPartContainer;
|
import org.hibernate.metamodel.mapping.ModelPartContainer;
|
||||||
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
|
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
|
||||||
|
import org.hibernate.metamodel.mapping.SelectionMapping;
|
||||||
import org.hibernate.metamodel.mapping.internal.EmbeddedCollectionPart;
|
import org.hibernate.metamodel.mapping.internal.EmbeddedCollectionPart;
|
||||||
import org.hibernate.metamodel.mapping.internal.EntityCollectionPart;
|
import org.hibernate.metamodel.mapping.internal.EntityCollectionPart;
|
||||||
import org.hibernate.metamodel.mapping.ordering.OrderByFragment;
|
import org.hibernate.metamodel.mapping.ordering.OrderByFragment;
|
||||||
|
@ -524,8 +526,11 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
public UpdateStatement visitUpdateStatement(SqmUpdateStatement sqmStatement) {
|
public UpdateStatement visitUpdateStatement(SqmUpdateStatement sqmStatement) {
|
||||||
Map<String, CteStatement> cteStatements = this.visitCteContainer( sqmStatement );
|
Map<String, CteStatement> cteStatements = this.visitCteContainer( sqmStatement );
|
||||||
|
|
||||||
final String entityName = sqmStatement.getTarget().getEntityName();
|
final SqmRoot<?> sqmTarget = sqmStatement.getTarget();
|
||||||
final EntityPersister entityDescriptor = getCreationContext().getDomainModel()
|
final String entityName = sqmTarget.getEntityName();
|
||||||
|
|
||||||
|
final EntityPersister entityDescriptor = getCreationContext()
|
||||||
|
.getDomainModel()
|
||||||
.getEntityDescriptor( entityName );
|
.getEntityDescriptor( entityName );
|
||||||
assert entityDescriptor != null;
|
assert entityDescriptor != null;
|
||||||
|
|
||||||
|
@ -538,7 +543,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
);
|
);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final NavigablePath rootPath = sqmStatement.getTarget().getNavigablePath();
|
final NavigablePath rootPath = sqmTarget.getNavigablePath();
|
||||||
final TableGroup rootTableGroup = entityDescriptor.createRootTableGroup(
|
final TableGroup rootTableGroup = entityDescriptor.createRootTableGroup(
|
||||||
rootPath,
|
rootPath,
|
||||||
sqmStatement.getRoot().getAlias(),
|
sqmStatement.getRoot().getAlias(),
|
||||||
|
@ -550,11 +555,21 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
);
|
);
|
||||||
|
|
||||||
if ( ! rootTableGroup.getTableReferenceJoins().isEmpty() ) {
|
if ( ! rootTableGroup.getTableReferenceJoins().isEmpty() ) {
|
||||||
throw new HibernateException( "Not expecting multiple table references for an SQM DELETE" );
|
throw new HibernateException( "Not expecting multiple table references for an SQM UPDATE" );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( sqmTarget.hasJoins() ) {
|
||||||
|
throw new HibernateException( "SQM UPDATE does not support explicit joins" );
|
||||||
}
|
}
|
||||||
|
|
||||||
getFromClauseAccess().registerTableGroup( rootPath, rootTableGroup );
|
getFromClauseAccess().registerTableGroup( rootPath, rootTableGroup );
|
||||||
|
|
||||||
|
// however, implicit joins are "ok" so long as they are embeddable-valued
|
||||||
|
applyManipulationImplicitJoins(
|
||||||
|
sqmTarget,
|
||||||
|
rootTableGroup
|
||||||
|
);
|
||||||
|
|
||||||
final List<Assignment> assignments = visitSetClause( sqmStatement.getSetClause() );
|
final List<Assignment> assignments = visitSetClause( sqmStatement.getSetClause() );
|
||||||
|
|
||||||
final FilterPredicate filterPredicate = FilterHelper.createFilterPredicate(
|
final FilterPredicate filterPredicate = FilterHelper.createFilterPredicate(
|
||||||
|
@ -590,6 +605,25 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void applyManipulationImplicitJoins(SqmPath<?> sqmPath, TableGroup correspondingTableGroup) {
|
||||||
|
consumeImplicitJoins(
|
||||||
|
sqmPath,
|
||||||
|
correspondingTableGroup,
|
||||||
|
BaseSqmToSqlAstConverter::verifyManipulationImplicitJoin
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void verifyManipulationImplicitJoin(SqmPath<?> joinedPath) {
|
||||||
|
//noinspection StatementWithEmptyBody
|
||||||
|
if ( joinedPath instanceof SqmEmbeddedValuedSimplePath<?> ) {
|
||||||
|
// this is fine
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// otherwise...
|
||||||
|
throw new QueryException( "Manipulation query may only contain embeddable joins" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Assignment> visitSetClause(SqmSetClause setClause) {
|
public List<Assignment> visitSetClause(SqmSetClause setClause) {
|
||||||
final List<Assignment> assignments = new ArrayList<>( setClause.getAssignments().size() );
|
final List<Assignment> assignments = new ArrayList<>( setClause.getAssignments().size() );
|
||||||
|
@ -601,18 +635,16 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
new SqlAstProcessingStateImpl(
|
new SqlAstProcessingStateImpl(
|
||||||
getCurrentProcessingState(),
|
getCurrentProcessingState(),
|
||||||
this,
|
this,
|
||||||
getCurrentClauseStack()::getCurrent
|
getCurrentClauseStack()::getCurrent) {
|
||||||
) {
|
|
||||||
@Override
|
@Override
|
||||||
public Expression resolveSqlExpression(
|
public Expression resolveSqlExpression(
|
||||||
String key,
|
String key,
|
||||||
Function<SqlAstProcessingState, Expression> creator) {
|
Function<SqlAstProcessingState, Expression> creator) {
|
||||||
final Expression expression = getParentState().getSqlExpressionResolver()
|
final Expression expression = getParentState()
|
||||||
|
.getSqlExpressionResolver()
|
||||||
.resolveSqlExpression( key, creator );
|
.resolveSqlExpression( key, creator );
|
||||||
assert expression instanceof ColumnReference;
|
assert expression instanceof ColumnReference;
|
||||||
|
|
||||||
targetColumnReferences.add( (ColumnReference) expression );
|
targetColumnReferences.add( (ColumnReference) expression );
|
||||||
|
|
||||||
return expression;
|
return expression;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -634,18 +666,16 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
new SqlAstProcessingStateImpl(
|
new SqlAstProcessingStateImpl(
|
||||||
getCurrentProcessingState(),
|
getCurrentProcessingState(),
|
||||||
this,
|
this,
|
||||||
getCurrentClauseStack()::getCurrent
|
getCurrentClauseStack()::getCurrent) {
|
||||||
) {
|
|
||||||
@Override
|
@Override
|
||||||
public Expression resolveSqlExpression(
|
public Expression resolveSqlExpression(
|
||||||
String key,
|
String key,
|
||||||
Function<SqlAstProcessingState, Expression> creator) {
|
Function<SqlAstProcessingState, Expression> creator) {
|
||||||
final Expression expression = getParentState().getSqlExpressionResolver()
|
final Expression expression = getParentState()
|
||||||
|
.getSqlExpressionResolver()
|
||||||
.resolveSqlExpression( key, creator );
|
.resolveSqlExpression( key, creator );
|
||||||
assert expression instanceof ColumnReference;
|
assert expression instanceof ColumnReference;
|
||||||
|
|
||||||
valueColumnReferences.add( (ColumnReference) expression );
|
valueColumnReferences.add( (ColumnReference) expression );
|
||||||
|
|
||||||
return expression;
|
return expression;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -655,31 +685,18 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if ( sqmAssignment.getValue() instanceof SqmParameter ) {
|
if ( sqmAssignment.getValue() instanceof SqmParameter ) {
|
||||||
final SqmParameter sqmParameter = (SqmParameter) sqmAssignment.getValue();
|
final SqmParameter<?> sqmParameter = (SqmParameter<?>) sqmAssignment.getValue();
|
||||||
final List<JdbcParameter> jdbcParametersForSqm = new ArrayList<>();
|
|
||||||
|
|
||||||
// create one JdbcParameter for each column in the assigned path
|
consumeSqmParameter(
|
||||||
assignedPathInterpretation.getExpressionType().forEachSelection(
|
sqmParameter,
|
||||||
(columnIndex, selection) -> {
|
(index, jdbcParameter) -> assignments.add(
|
||||||
final JdbcParameter jdbcParameter = new JdbcParameterImpl( selection.getJdbcMapping() );
|
|
||||||
jdbcParametersForSqm.add( jdbcParameter );
|
|
||||||
assignments.add(
|
|
||||||
new Assignment(
|
new Assignment(
|
||||||
new ColumnReference(
|
targetColumnReferences.get( index ),
|
||||||
// we do not want a qualifier (table alias) here
|
|
||||||
(String) null,
|
|
||||||
selection,
|
|
||||||
getCreationContext().getSessionFactory()
|
|
||||||
),
|
|
||||||
jdbcParameter
|
jdbcParameter
|
||||||
)
|
)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
);
|
|
||||||
|
|
||||||
getJdbcParamsBySqmParam().computeIfAbsent( sqmParameter, k -> new ArrayList<>( 1 ) )
|
|
||||||
.add( jdbcParametersForSqm );
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
final Expression valueExpression = (Expression) sqmAssignment.getValue().accept( this );
|
final Expression valueExpression = (Expression) sqmAssignment.getValue().accept( this );
|
||||||
|
|
||||||
|
@ -1850,6 +1867,17 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
}
|
}
|
||||||
|
|
||||||
private void consumeImplicitJoins(SqmPath<?> sqmPath, TableGroup tableGroup) {
|
private void consumeImplicitJoins(SqmPath<?> sqmPath, TableGroup tableGroup) {
|
||||||
|
consumeImplicitJoins(
|
||||||
|
sqmPath,
|
||||||
|
tableGroup,
|
||||||
|
(sqmSubPath) -> {}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void consumeImplicitJoins(
|
||||||
|
SqmPath<?> sqmPath,
|
||||||
|
TableGroup tableGroup,
|
||||||
|
Consumer<SqmPath<?>> implicitJoinChecker) {
|
||||||
if ( log.isTraceEnabled() ) {
|
if ( log.isTraceEnabled() ) {
|
||||||
log.tracef( "Visiting implicit joins for `%s`", sqmPath.getNavigablePath() );
|
log.tracef( "Visiting implicit joins for `%s`", sqmPath.getNavigablePath() );
|
||||||
}
|
}
|
||||||
|
@ -1859,6 +1887,9 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
if ( log.isTraceEnabled() ) {
|
if ( log.isTraceEnabled() ) {
|
||||||
log.tracef( "Starting implicit join handling for `%s`", joinedPath.getNavigablePath() );
|
log.tracef( "Starting implicit join handling for `%s`", joinedPath.getNavigablePath() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
implicitJoinChecker.accept( joinedPath );
|
||||||
|
|
||||||
final FromClauseIndex fromClauseIndex = getFromClauseIndex();
|
final FromClauseIndex fromClauseIndex = getFromClauseIndex();
|
||||||
assert fromClauseIndex.findTableGroup( joinedPath.getLhs().getNavigablePath() ) == tableGroup;
|
assert fromClauseIndex.findTableGroup( joinedPath.getLhs().getNavigablePath() ) == tableGroup;
|
||||||
|
|
||||||
|
@ -1882,7 +1913,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
|
|
||||||
fromClauseIndex.register( joinedPath, tableGroupJoin.getJoinedGroup() );
|
fromClauseIndex.register( joinedPath, tableGroupJoin.getJoinedGroup() );
|
||||||
|
|
||||||
consumeImplicitJoins( joinedPath, tableGroupJoin.getJoinedGroup() );
|
consumeImplicitJoins( joinedPath, tableGroupJoin.getJoinedGroup(), implicitJoinChecker );
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -2146,8 +2177,42 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected Expression consumeSqmParameter(
|
||||||
|
SqmParameter sqmParameter,
|
||||||
|
BiConsumer<Integer,JdbcParameter> jdbcParameterConsumer) {
|
||||||
|
final MappingModelExpressable valueMapping = determineValueMapping( sqmParameter );
|
||||||
|
|
||||||
|
final List<JdbcParameter> jdbcParametersForSqm = new ArrayList<>();
|
||||||
|
|
||||||
|
resolveSqmParameter(
|
||||||
|
sqmParameter,
|
||||||
|
valueMapping,
|
||||||
|
(index,jdbcParameter) -> {
|
||||||
|
jdbcParameterConsumer.accept( index, jdbcParameter );
|
||||||
|
jdbcParametersForSqm.add( jdbcParameter );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
this.jdbcParameters.addParameters( jdbcParametersForSqm );
|
||||||
|
this.jdbcParamsBySqmParam
|
||||||
|
.computeIfAbsent( sqmParameter, k -> new ArrayList<>( 1 ) )
|
||||||
|
.add( jdbcParametersForSqm );
|
||||||
|
|
||||||
|
final QueryParameterImplementor<?> queryParameter = domainParameterXref.getQueryParameter( sqmParameter );
|
||||||
|
final QueryParameterBinding<?> binding = domainParameterBindings.getBinding( queryParameter );
|
||||||
|
binding.setType( valueMapping );
|
||||||
|
return new SqmParameterInterpretation(
|
||||||
|
sqmParameter,
|
||||||
|
queryParameter,
|
||||||
|
jdbcParametersForSqm,
|
||||||
|
valueMapping,
|
||||||
|
qp -> binding
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
protected Expression consumeSqmParameter(SqmParameter sqmParameter) {
|
protected Expression consumeSqmParameter(SqmParameter sqmParameter) {
|
||||||
final MappingModelExpressable valueMapping = determineValueMapping( sqmParameter );
|
final MappingModelExpressable valueMapping = determineValueMapping( sqmParameter );
|
||||||
|
|
||||||
final List<JdbcParameter> jdbcParametersForSqm = new ArrayList<>();
|
final List<JdbcParameter> jdbcParametersForSqm = new ArrayList<>();
|
||||||
|
|
||||||
resolveSqmParameter(
|
resolveSqmParameter(
|
||||||
|
@ -2157,7 +2222,8 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
);
|
);
|
||||||
|
|
||||||
this.jdbcParameters.addParameters( jdbcParametersForSqm );
|
this.jdbcParameters.addParameters( jdbcParametersForSqm );
|
||||||
this.jdbcParamsBySqmParam.computeIfAbsent( sqmParameter, k -> new ArrayList<>( 1 ) )
|
this.jdbcParamsBySqmParam
|
||||||
|
.computeIfAbsent( sqmParameter, k -> new ArrayList<>( 1 ) )
|
||||||
.add( jdbcParametersForSqm );
|
.add( jdbcParametersForSqm );
|
||||||
|
|
||||||
final QueryParameterImplementor<?> queryParameter = domainParameterXref.getQueryParameter( sqmParameter );
|
final QueryParameterImplementor<?> queryParameter = domainParameterXref.getQueryParameter( sqmParameter );
|
||||||
|
@ -2329,15 +2395,15 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
private void resolveSqmParameter(
|
private void resolveSqmParameter(
|
||||||
SqmParameter expression,
|
SqmParameter expression,
|
||||||
MappingModelExpressable valueMapping,
|
MappingModelExpressable valueMapping,
|
||||||
Consumer<JdbcParameter> jdbcParameterConsumer) {
|
BiConsumer<Integer,JdbcParameter> jdbcParameterConsumer) {
|
||||||
if ( valueMapping instanceof Association ) {
|
if ( valueMapping instanceof Association ) {
|
||||||
( (Association) valueMapping ).getForeignKeyDescriptor().forEachJdbcType(
|
( (Association) valueMapping ).getForeignKeyDescriptor().forEachJdbcType(
|
||||||
(index, jdbcMapping) -> jdbcParameterConsumer.accept( new JdbcParameterImpl( jdbcMapping ) )
|
(index, jdbcMapping) -> jdbcParameterConsumer.accept( index, new JdbcParameterImpl( jdbcMapping ) )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
valueMapping.forEachJdbcType(
|
valueMapping.forEachJdbcType(
|
||||||
(index, jdbcMapping) -> jdbcParameterConsumer.accept( new JdbcParameterImpl( jdbcMapping ) )
|
(index, jdbcMapping) -> jdbcParameterConsumer.accept( index, new JdbcParameterImpl( jdbcMapping ) )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -327,8 +327,8 @@ public class SqmSubQuery<T> extends AbstractSqmSelectQuery<T> implements SqmSele
|
||||||
@Override
|
@Override
|
||||||
public void applyInferableType(SqmExpressable<?> type) {
|
public void applyInferableType(SqmExpressable<?> type) {
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
// this.expressableType = (SqmExpressable) type;
|
this.expressableType = (SqmExpressable<T>) type;
|
||||||
// setResultType( type == null ? null : type.getExpressableJavaTypeDescriptor().getJavaType() );
|
setResultType( type == null ? null : expressableType.getExpressableJavaTypeDescriptor().getJavaTypeClass() );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -45,6 +45,9 @@ public interface SqlExpressionResolver {
|
||||||
* @see #resolveSqlExpression
|
* @see #resolveSqlExpression
|
||||||
*/
|
*/
|
||||||
static String createColumnReferenceKey(TableReference tableReference, String columnExpression) {
|
static String createColumnReferenceKey(TableReference tableReference, String columnExpression) {
|
||||||
|
assert tableReference != null : "tableReference expected to be non-null";
|
||||||
|
assert columnExpression != null : "columnExpression expected to be non-null";
|
||||||
|
|
||||||
final String qualifier = tableReference.getIdentificationVariable() == null
|
final String qualifier = tableReference.getIdentificationVariable() == null
|
||||||
? tableReference.getTableExpression()
|
? tableReference.getTableExpression()
|
||||||
: tableReference.getIdentificationVariable();
|
: tableReference.getIdentificationVariable();
|
||||||
|
|
|
@ -75,23 +75,23 @@ public class ColumnReference implements Expression, Assignable {
|
||||||
if ( isFormula ) {
|
if ( isFormula ) {
|
||||||
this.readExpression = this.columnExpression;
|
this.readExpression = this.columnExpression;
|
||||||
}
|
}
|
||||||
else if ( customReadExpression == null ) {
|
else if ( customReadExpression != null ) {
|
||||||
|
this.readExpression = StringHelper.replace( customReadExpression, Template.TEMPLATE, qualifier );
|
||||||
|
}
|
||||||
|
else {
|
||||||
this.readExpression = this.qualifier == null
|
this.readExpression = this.qualifier == null
|
||||||
? this.columnExpression
|
? this.columnExpression
|
||||||
: this.qualifier + "." + this.columnExpression;
|
: this.qualifier + "." + this.columnExpression;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
this.readExpression = customReadExpression;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isFormula ) {
|
if ( isFormula ) {
|
||||||
this.writeExpression = null;
|
this.writeExpression = null;
|
||||||
}
|
}
|
||||||
else if ( customWriteExpression == null ) {
|
else if ( customWriteExpression != null ) {
|
||||||
this.writeExpression = DEFAULT_COLUMN_WRITE_EXPRESSION;
|
this.writeExpression = StringHelper.replace( customWriteExpression, Template.TEMPLATE, qualifier );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this.writeExpression = customWriteExpression;
|
this.writeExpression = DEFAULT_COLUMN_WRITE_EXPRESSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.jdbcMapping = jdbcMapping;
|
this.jdbcMapping = jdbcMapping;
|
||||||
|
|
|
@ -55,7 +55,7 @@ public class ResultsHelper {
|
||||||
if ( existing != null ) {
|
if ( existing != null ) {
|
||||||
if ( fetchedModelPart.getNavigableRole().equals(
|
if ( fetchedModelPart.getNavigableRole().equals(
|
||||||
existing.getInitializedPart().getNavigableRole() ) ) {
|
existing.getInitializedPart().getNavigableRole() ) ) {
|
||||||
ResultsLogger.LOGGER.debugf(
|
ResultsLogger.LOGGER.tracef(
|
||||||
"Returning previously-registered initializer : %s",
|
"Returning previously-registered initializer : %s",
|
||||||
existing
|
existing
|
||||||
);
|
);
|
||||||
|
@ -64,7 +64,7 @@ public class ResultsHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
final Initializer initializer = producer.get();
|
final Initializer initializer = producer.get();
|
||||||
ResultsLogger.LOGGER.debugf(
|
ResultsLogger.LOGGER.tracef(
|
||||||
"Registering initializer : %s",
|
"Registering initializer : %s",
|
||||||
initializer
|
initializer
|
||||||
);
|
);
|
||||||
|
|
|
@ -11,6 +11,7 @@ import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.hibernate.MappingException;
|
||||||
import org.hibernate.boot.Metadata;
|
import org.hibernate.boot.Metadata;
|
||||||
import org.hibernate.boot.model.naming.Identifier;
|
import org.hibernate.boot.model.naming.Identifier;
|
||||||
import org.hibernate.boot.model.relational.InitCommand;
|
import org.hibernate.boot.model.relational.InitCommand;
|
||||||
|
@ -42,6 +43,8 @@ public class StandardTableExporter implements Exporter<Table> {
|
||||||
table.getNameIdentifier()
|
table.getNameIdentifier()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment();
|
final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment();
|
||||||
StringBuilder buf =
|
StringBuilder buf =
|
||||||
new StringBuilder( tableCreateString( table.hasPrimaryKey() ) )
|
new StringBuilder( tableCreateString( table.hasPrimaryKey() ) )
|
||||||
|
@ -90,7 +93,8 @@ public class StandardTableExporter implements Exporter<Table> {
|
||||||
buf.append( col.getSqlType( dialect, metadata ) );
|
buf.append( col.getSqlType( dialect, metadata ) );
|
||||||
}
|
}
|
||||||
buf.append( ' ' )
|
buf.append( ' ' )
|
||||||
.append( dialect.getIdentityColumnSupport().getIdentityColumnString( col.getSqlTypeCode( metadata ) ) );
|
.append( dialect.getIdentityColumnSupport()
|
||||||
|
.getIdentityColumnString( col.getSqlTypeCode( metadata ) ) );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
buf.append( col.getSqlType( dialect, metadata ) );
|
buf.append( col.getSqlType( dialect, metadata ) );
|
||||||
|
@ -155,6 +159,10 @@ public class StandardTableExporter implements Exporter<Table> {
|
||||||
|
|
||||||
return sqlStrings.toArray( new String[ sqlStrings.size() ] );
|
return sqlStrings.toArray( new String[ sqlStrings.size() ] );
|
||||||
}
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
throw new MappingException( "Error creating SQL create commands for table : " + tableName, e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected void applyComments(Table table, QualifiedName tableName, List<String> sqlStrings) {
|
protected void applyComments(Table table, QualifiedName tableName, List<String> sqlStrings) {
|
||||||
if ( dialect.supportsCommentOn() ) {
|
if ( dialect.supportsCommentOn() ) {
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* 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.type;
|
||||||
|
|
||||||
|
import org.hibernate.metamodel.model.convert.spi.BasicValueConverter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extension for BasicType impls which have an implied conversion
|
||||||
|
*/
|
||||||
|
public interface ConvertedBasicType<J> extends BasicType<J> {
|
||||||
|
BasicValueConverter<J,?> getValueConverter();
|
||||||
|
}
|
|
@ -9,8 +9,11 @@ package org.hibernate.type;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
import org.hibernate.dialect.Dialect;
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.metamodel.model.convert.spi.BasicValueConverter;
|
||||||
import org.hibernate.query.CastType;
|
import org.hibernate.query.CastType;
|
||||||
import org.hibernate.type.descriptor.java.BooleanTypeDescriptor;
|
import org.hibernate.type.descriptor.java.BooleanTypeDescriptor;
|
||||||
|
import org.hibernate.type.descriptor.java.CharacterTypeDescriptor;
|
||||||
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.sql.CharTypeDescriptor;
|
import org.hibernate.type.descriptor.sql.CharTypeDescriptor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -21,29 +24,35 @@ import org.hibernate.type.descriptor.sql.CharTypeDescriptor;
|
||||||
*/
|
*/
|
||||||
public class TrueFalseType
|
public class TrueFalseType
|
||||||
extends AbstractSingleColumnStandardBasicType<Boolean>
|
extends AbstractSingleColumnStandardBasicType<Boolean>
|
||||||
implements PrimitiveType<Boolean>, DiscriminatorType<Boolean> {
|
implements PrimitiveType<Boolean>, DiscriminatorType<Boolean>, ConvertedBasicType<Boolean> {
|
||||||
|
|
||||||
public static final TrueFalseType INSTANCE = new TrueFalseType();
|
public static final TrueFalseType INSTANCE = new TrueFalseType();
|
||||||
|
private static final TrueFalseConverter CONVERTER = new TrueFalseConverter();
|
||||||
|
|
||||||
public TrueFalseType() {
|
public TrueFalseType() {
|
||||||
super( CharTypeDescriptor.INSTANCE, new BooleanTypeDescriptor( 'T', 'F' ) );
|
super( CharTypeDescriptor.INSTANCE, new BooleanTypeDescriptor( 'T', 'F' ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return "true_false";
|
return "true_false";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class getPrimitiveClass() {
|
public Class getPrimitiveClass() {
|
||||||
return boolean.class;
|
return boolean.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Boolean stringToObject(String xml) throws Exception {
|
public Boolean stringToObject(String xml) throws Exception {
|
||||||
return fromString( xml );
|
return fromString( xml );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Serializable getDefaultValue() {
|
public Serializable getDefaultValue() {
|
||||||
return Boolean.FALSE;
|
return Boolean.FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String objectToSQLString(Boolean value, Dialect dialect) throws Exception {
|
public String objectToSQLString(Boolean value, Dialect dialect) throws Exception {
|
||||||
return StringType.INSTANCE.objectToSQLString( value ? "T" : "F", dialect );
|
return StringType.INSTANCE.objectToSQLString( value ? "T" : "F", dialect );
|
||||||
|
@ -53,4 +62,47 @@ public class TrueFalseType
|
||||||
public CastType getCastType() {
|
public CastType getCastType() {
|
||||||
return CastType.TF_BOOLEAN;
|
return CastType.TF_BOOLEAN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BasicValueConverter<Boolean, ?> getValueConverter() {
|
||||||
|
return CONVERTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class TrueFalseConverter implements BasicValueConverter<Boolean, Character> {
|
||||||
|
@Override
|
||||||
|
public Boolean toDomainValue(Character relationalForm) {
|
||||||
|
if ( relationalForm == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( 'T' == relationalForm ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( 'F' == relationalForm ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Character toRelationalValue(Boolean domainForm) {
|
||||||
|
if ( domainForm == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return domainForm ? 'T' : 'F';
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JavaTypeDescriptor<Boolean> getDomainJavaDescriptor() {
|
||||||
|
return BooleanTypeDescriptor.INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JavaTypeDescriptor<Character> getRelationalJavaDescriptor() {
|
||||||
|
return CharacterTypeDescriptor.INSTANCE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,8 +9,11 @@ package org.hibernate.type;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
import org.hibernate.dialect.Dialect;
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.metamodel.model.convert.spi.BasicValueConverter;
|
||||||
import org.hibernate.query.CastType;
|
import org.hibernate.query.CastType;
|
||||||
import org.hibernate.type.descriptor.java.BooleanTypeDescriptor;
|
import org.hibernate.type.descriptor.java.BooleanTypeDescriptor;
|
||||||
|
import org.hibernate.type.descriptor.java.CharacterTypeDescriptor;
|
||||||
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.sql.CharTypeDescriptor;
|
import org.hibernate.type.descriptor.sql.CharTypeDescriptor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -21,29 +24,35 @@ import org.hibernate.type.descriptor.sql.CharTypeDescriptor;
|
||||||
*/
|
*/
|
||||||
public class YesNoType
|
public class YesNoType
|
||||||
extends AbstractSingleColumnStandardBasicType<Boolean>
|
extends AbstractSingleColumnStandardBasicType<Boolean>
|
||||||
implements PrimitiveType<Boolean>, DiscriminatorType<Boolean> {
|
implements PrimitiveType<Boolean>, DiscriminatorType<Boolean>, ConvertedBasicType<Boolean> {
|
||||||
|
|
||||||
public static final YesNoType INSTANCE = new YesNoType();
|
public static final YesNoType INSTANCE = new YesNoType();
|
||||||
|
private static final YesNoConverter CONVERTER = new YesNoConverter();
|
||||||
|
|
||||||
public YesNoType() {
|
public YesNoType() {
|
||||||
super( CharTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE );
|
super( CharTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return "yes_no";
|
return "yes_no";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class getPrimitiveClass() {
|
public Class getPrimitiveClass() {
|
||||||
return boolean.class;
|
return boolean.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Boolean stringToObject(String xml) throws Exception {
|
public Boolean stringToObject(String xml) throws Exception {
|
||||||
return fromString( xml );
|
return fromString( xml );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Serializable getDefaultValue() {
|
public Serializable getDefaultValue() {
|
||||||
return Boolean.FALSE;
|
return Boolean.FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String objectToSQLString(Boolean value, Dialect dialect) throws Exception {
|
public String objectToSQLString(Boolean value, Dialect dialect) throws Exception {
|
||||||
return StringType.INSTANCE.objectToSQLString( value ? "Y" : "N", dialect );
|
return StringType.INSTANCE.objectToSQLString( value ? "Y" : "N", dialect );
|
||||||
|
@ -53,4 +62,47 @@ public class YesNoType
|
||||||
public CastType getCastType() {
|
public CastType getCastType() {
|
||||||
return CastType.YN_BOOLEAN;
|
return CastType.YN_BOOLEAN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BasicValueConverter<Boolean, ?> getValueConverter() {
|
||||||
|
return CONVERTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class YesNoConverter implements BasicValueConverter<Boolean, Character> {
|
||||||
|
@Override
|
||||||
|
public Boolean toDomainValue(Character relationalForm) {
|
||||||
|
if ( relationalForm == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( 'Y' == relationalForm ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( 'N' == relationalForm ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Character toRelationalValue(Boolean domainForm) {
|
||||||
|
if ( domainForm == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return domainForm ? 'Y' : 'N';
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JavaTypeDescriptor<Boolean> getDomainJavaDescriptor() {
|
||||||
|
return BooleanTypeDescriptor.INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JavaTypeDescriptor<Character> getRelationalJavaDescriptor() {
|
||||||
|
return CharacterTypeDescriptor.INSTANCE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
* 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.type.descriptor;
|
||||||
|
|
||||||
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
|
public interface JdbcBindingLogging {
|
||||||
|
String NAME = "org.hibernate.orm.jdbc.bind";
|
||||||
|
|
||||||
|
Logger LOGGER = Logger.getLogger( NAME );
|
||||||
|
|
||||||
|
boolean TRACE_ENABLED = LOGGER.isTraceEnabled();
|
||||||
|
boolean DEBUG_ENABLED = LOGGER.isDebugEnabled();
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
* 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.type.descriptor;
|
||||||
|
|
||||||
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
|
public interface JdbcExtractingLogging {
|
||||||
|
String NAME = "org.hibernate.orm.jdbc.extract";
|
||||||
|
|
||||||
|
Logger LOGGER = Logger.getLogger( NAME );
|
||||||
|
|
||||||
|
boolean TRACE_ENABLED = LOGGER.isTraceEnabled();
|
||||||
|
boolean DEBUG_ENABLED = LOGGER.isDebugEnabled();
|
||||||
|
|
||||||
|
}
|
|
@ -10,7 +10,7 @@ import java.sql.CallableStatement;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
import org.hibernate.internal.CoreLogging;
|
import org.hibernate.type.descriptor.JdbcBindingLogging;
|
||||||
import org.hibernate.type.descriptor.JdbcTypeNameMapper;
|
import org.hibernate.type.descriptor.JdbcTypeNameMapper;
|
||||||
import org.hibernate.type.descriptor.ValueBinder;
|
import org.hibernate.type.descriptor.ValueBinder;
|
||||||
import org.hibernate.type.descriptor.WrapperOptions;
|
import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
|
@ -24,8 +24,6 @@ import org.jboss.logging.Logger;
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public abstract class BasicBinder<J> implements ValueBinder<J> {
|
public abstract class BasicBinder<J> implements ValueBinder<J> {
|
||||||
private static final Logger log = CoreLogging.logger( BasicBinder.class );
|
|
||||||
|
|
||||||
private static final String BIND_MSG_TEMPLATE = "binding parameter [%s] as [%s] - [%s]";
|
private static final String BIND_MSG_TEMPLATE = "binding parameter [%s] as [%s] - [%s]";
|
||||||
private static final String NULL_BIND_MSG_TEMPLATE = "binding parameter [%s] as [%s] - [null]";
|
private static final String NULL_BIND_MSG_TEMPLATE = "binding parameter [%s] as [%s] - [null]";
|
||||||
|
|
||||||
|
@ -48,8 +46,8 @@ public abstract class BasicBinder<J> implements ValueBinder<J> {
|
||||||
@Override
|
@Override
|
||||||
public final void bind(PreparedStatement st, J value, int index, WrapperOptions options) throws SQLException {
|
public final void bind(PreparedStatement st, J value, int index, WrapperOptions options) throws SQLException {
|
||||||
if ( value == null ) {
|
if ( value == null ) {
|
||||||
if ( log.isTraceEnabled() ) {
|
if ( JdbcBindingLogging.TRACE_ENABLED ) {
|
||||||
log.trace(
|
JdbcBindingLogging.LOGGER.trace(
|
||||||
String.format(
|
String.format(
|
||||||
NULL_BIND_MSG_TEMPLATE,
|
NULL_BIND_MSG_TEMPLATE,
|
||||||
index,
|
index,
|
||||||
|
@ -60,8 +58,8 @@ public abstract class BasicBinder<J> implements ValueBinder<J> {
|
||||||
st.setNull( index, sqlDescriptor.getSqlType() );
|
st.setNull( index, sqlDescriptor.getSqlType() );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ( log.isTraceEnabled() ) {
|
if ( JdbcBindingLogging.TRACE_ENABLED ) {
|
||||||
log.trace(
|
JdbcBindingLogging.LOGGER.trace(
|
||||||
String.format(
|
String.format(
|
||||||
BIND_MSG_TEMPLATE,
|
BIND_MSG_TEMPLATE,
|
||||||
index,
|
index,
|
||||||
|
@ -77,8 +75,8 @@ public abstract class BasicBinder<J> implements ValueBinder<J> {
|
||||||
@Override
|
@Override
|
||||||
public final void bind(CallableStatement st, J value, String name, WrapperOptions options) throws SQLException {
|
public final void bind(CallableStatement st, J value, String name, WrapperOptions options) throws SQLException {
|
||||||
if ( value == null ) {
|
if ( value == null ) {
|
||||||
if ( log.isTraceEnabled() ) {
|
if ( JdbcBindingLogging.TRACE_ENABLED ) {
|
||||||
log.trace(
|
JdbcBindingLogging.LOGGER.trace(
|
||||||
String.format(
|
String.format(
|
||||||
NULL_BIND_MSG_TEMPLATE,
|
NULL_BIND_MSG_TEMPLATE,
|
||||||
name,
|
name,
|
||||||
|
@ -89,8 +87,8 @@ public abstract class BasicBinder<J> implements ValueBinder<J> {
|
||||||
st.setNull( name, sqlDescriptor.getSqlType() );
|
st.setNull( name, sqlDescriptor.getSqlType() );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ( log.isTraceEnabled() ) {
|
if ( JdbcBindingLogging.TRACE_ENABLED ) {
|
||||||
log.trace(
|
JdbcBindingLogging.LOGGER.trace(
|
||||||
String.format(
|
String.format(
|
||||||
BIND_MSG_TEMPLATE,
|
BIND_MSG_TEMPLATE,
|
||||||
name,
|
name,
|
||||||
|
|
|
@ -10,22 +10,18 @@ import java.sql.CallableStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
import org.hibernate.internal.CoreLogging;
|
import org.hibernate.type.descriptor.JdbcExtractingLogging;
|
||||||
import org.hibernate.type.descriptor.JdbcTypeNameMapper;
|
import org.hibernate.type.descriptor.JdbcTypeNameMapper;
|
||||||
import org.hibernate.type.descriptor.ValueExtractor;
|
import org.hibernate.type.descriptor.ValueExtractor;
|
||||||
import org.hibernate.type.descriptor.WrapperOptions;
|
import org.hibernate.type.descriptor.WrapperOptions;
|
||||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convenience base implementation of {@link org.hibernate.type.descriptor.ValueExtractor}
|
* Convenience base implementation of {@link org.hibernate.type.descriptor.ValueExtractor}
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public abstract class BasicExtractor<J> implements ValueExtractor<J> {
|
public abstract class BasicExtractor<J> implements ValueExtractor<J> {
|
||||||
private static final Logger log = CoreLogging.logger( BasicExtractor.class );
|
|
||||||
|
|
||||||
private final JavaTypeDescriptor<J> javaDescriptor;
|
private final JavaTypeDescriptor<J> javaDescriptor;
|
||||||
private final SqlTypeDescriptor sqlDescriptor;
|
private final SqlTypeDescriptor sqlDescriptor;
|
||||||
|
|
||||||
|
@ -46,8 +42,8 @@ public abstract class BasicExtractor<J> implements ValueExtractor<J> {
|
||||||
public J extract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
public J extract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
|
||||||
final J value = doExtract( rs, paramIndex, options );
|
final J value = doExtract( rs, paramIndex, options );
|
||||||
if ( value == null || rs.wasNull() ) {
|
if ( value == null || rs.wasNull() ) {
|
||||||
if ( log.isTraceEnabled() ) {
|
if ( JdbcExtractingLogging.TRACE_ENABLED ) {
|
||||||
log.tracef(
|
JdbcExtractingLogging.LOGGER.tracef(
|
||||||
"extracted value ([%s] : [%s]) - [null]",
|
"extracted value ([%s] : [%s]) - [null]",
|
||||||
paramIndex,
|
paramIndex,
|
||||||
JdbcTypeNameMapper.getTypeName( getSqlDescriptor().getSqlType() )
|
JdbcTypeNameMapper.getTypeName( getSqlDescriptor().getSqlType() )
|
||||||
|
@ -56,8 +52,8 @@ public abstract class BasicExtractor<J> implements ValueExtractor<J> {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ( log.isTraceEnabled() ) {
|
if ( JdbcExtractingLogging.TRACE_ENABLED ) {
|
||||||
log.tracef(
|
JdbcExtractingLogging.LOGGER.tracef(
|
||||||
"extracted value ([%s] : [%s]) - [%s]",
|
"extracted value ([%s] : [%s]) - [%s]",
|
||||||
paramIndex,
|
paramIndex,
|
||||||
JdbcTypeNameMapper.getTypeName( getSqlDescriptor().getSqlType() ),
|
JdbcTypeNameMapper.getTypeName( getSqlDescriptor().getSqlType() ),
|
||||||
|
@ -84,8 +80,8 @@ public abstract class BasicExtractor<J> implements ValueExtractor<J> {
|
||||||
public J extract(CallableStatement statement, int paramIndex, WrapperOptions options) throws SQLException {
|
public J extract(CallableStatement statement, int paramIndex, WrapperOptions options) throws SQLException {
|
||||||
final J value = doExtract( statement, paramIndex, options );
|
final J value = doExtract( statement, paramIndex, options );
|
||||||
if ( value == null || statement.wasNull() ) {
|
if ( value == null || statement.wasNull() ) {
|
||||||
if ( log.isTraceEnabled() ) {
|
if ( JdbcExtractingLogging.TRACE_ENABLED ) {
|
||||||
log.tracef(
|
JdbcExtractingLogging.LOGGER.tracef(
|
||||||
"extracted procedure output parameter ([%s] : [%s]) - [null]",
|
"extracted procedure output parameter ([%s] : [%s]) - [null]",
|
||||||
paramIndex,
|
paramIndex,
|
||||||
JdbcTypeNameMapper.getTypeName( getSqlDescriptor().getSqlType() )
|
JdbcTypeNameMapper.getTypeName( getSqlDescriptor().getSqlType() )
|
||||||
|
@ -94,8 +90,8 @@ public abstract class BasicExtractor<J> implements ValueExtractor<J> {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ( log.isTraceEnabled() ) {
|
if ( JdbcExtractingLogging.TRACE_ENABLED ) {
|
||||||
log.tracef(
|
JdbcExtractingLogging.LOGGER.tracef(
|
||||||
"extracted procedure output parameter ([%s] : [%s]) - [%s]",
|
"extracted procedure output parameter ([%s] : [%s]) - [%s]",
|
||||||
paramIndex,
|
paramIndex,
|
||||||
JdbcTypeNameMapper.getTypeName( getSqlDescriptor().getSqlType() ),
|
JdbcTypeNameMapper.getTypeName( getSqlDescriptor().getSqlType() ),
|
||||||
|
@ -122,8 +118,8 @@ public abstract class BasicExtractor<J> implements ValueExtractor<J> {
|
||||||
public J extract(CallableStatement statement, String paramName, WrapperOptions options) throws SQLException {
|
public J extract(CallableStatement statement, String paramName, WrapperOptions options) throws SQLException {
|
||||||
final J value = doExtract( statement, paramName, options );
|
final J value = doExtract( statement, paramName, options );
|
||||||
if ( value == null || statement.wasNull() ) {
|
if ( value == null || statement.wasNull() ) {
|
||||||
if ( log.isTraceEnabled() ) {
|
if ( JdbcExtractingLogging.TRACE_ENABLED ) {
|
||||||
log.tracef(
|
JdbcExtractingLogging.LOGGER.tracef(
|
||||||
"extracted named procedure output parameter ([%s] : [%s]) - [null]",
|
"extracted named procedure output parameter ([%s] : [%s]) - [null]",
|
||||||
paramName,
|
paramName,
|
||||||
JdbcTypeNameMapper.getTypeName( getSqlDescriptor().getSqlType() )
|
JdbcTypeNameMapper.getTypeName( getSqlDescriptor().getSqlType() )
|
||||||
|
@ -132,8 +128,8 @@ public abstract class BasicExtractor<J> implements ValueExtractor<J> {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ( log.isTraceEnabled() ) {
|
if ( JdbcExtractingLogging.TRACE_ENABLED ) {
|
||||||
log.tracef(
|
JdbcExtractingLogging.LOGGER.tracef(
|
||||||
"extracted named procedure output parameter ([%s] : [%s]) - [%s]",
|
"extracted named procedure output parameter ([%s] : [%s]) - [%s]",
|
||||||
paramName,
|
paramName,
|
||||||
JdbcTypeNameMapper.getTypeName( getSqlDescriptor().getSqlType() ),
|
JdbcTypeNameMapper.getTypeName( getSqlDescriptor().getSqlType() ),
|
||||||
|
|
|
@ -48,8 +48,12 @@ import org.hibernate.boot.model.relational.Namespace;
|
||||||
import org.hibernate.mapping.Column;
|
import org.hibernate.mapping.Column;
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
import org.junit.Test;
|
import org.hibernate.testing.orm.junit.DomainModelScope;
|
||||||
|
import org.hibernate.testing.orm.junit.NotImplementedYet;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
|
@ -60,115 +64,121 @@ import static org.junit.Assert.fail;
|
||||||
* @author Christian Beikov
|
* @author Christian Beikov
|
||||||
*/
|
*/
|
||||||
@TestForIssue( jiraKey = "HHH-11180" )
|
@TestForIssue( jiraKey = "HHH-11180" )
|
||||||
public class ForeignKeyConstraintTest extends BaseNonConfigCoreFunctionalTestCase {
|
@DomainModel(
|
||||||
|
annotatedClasses = {
|
||||||
@Override
|
ForeignKeyConstraintTest.CreditCard.class,
|
||||||
protected Class<?>[] getAnnotatedClasses() {
|
ForeignKeyConstraintTest.Person.class,
|
||||||
return new Class<?>[] {
|
ForeignKeyConstraintTest.Student.class,
|
||||||
CreditCard.class,
|
ForeignKeyConstraintTest.Professor.class,
|
||||||
Person.class,
|
ForeignKeyConstraintTest.Vehicle.class,
|
||||||
Student.class,
|
ForeignKeyConstraintTest.VehicleBuyInfo.class,
|
||||||
Professor.class,
|
ForeignKeyConstraintTest.Car.class,
|
||||||
Vehicle.class,
|
ForeignKeyConstraintTest.Truck.class,
|
||||||
VehicleBuyInfo.class,
|
ForeignKeyConstraintTest.Company.class,
|
||||||
Car.class,
|
ForeignKeyConstraintTest.PlanItem.class,
|
||||||
Truck.class,
|
ForeignKeyConstraintTest.Task.class
|
||||||
Company.class,
|
}
|
||||||
PlanItem.class,
|
)
|
||||||
Task.class
|
@SessionFactory
|
||||||
};
|
public class ForeignKeyConstraintTest {
|
||||||
|
@Test
|
||||||
|
public void testJoinColumn(DomainModelScope scope) {
|
||||||
|
assertForeignKey( scope, "FK_CAR_OWNER", "OWNER_PERSON_ID" );
|
||||||
|
assertForeignKey( scope, "FK_CAR_OWNER3", "OWNER_PERSON_ID3" );
|
||||||
|
assertForeignKey( scope, "FK_PERSON_CC", "PERSON_CC_ID" );
|
||||||
|
assertNoForeignKey( scope, "FK_CAR_OWNER2", "OWNER_PERSON_ID2" );
|
||||||
|
assertNoForeignKey( scope, "FK_CAR_OWNER4", "OWNER_PERSON_ID4" );
|
||||||
|
assertNoForeignKey( scope, "FK_PERSON_CC2", "PERSON_CC_ID2" );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testJoinColumn() {
|
public void testJoinColumns(DomainModelScope scope) {
|
||||||
assertForeignKey( "FK_CAR_OWNER", "OWNER_PERSON_ID" );
|
assertForeignKey( scope, "FK_STUDENT_CAR", "CAR_NR", "CAR_VENDOR_NR" );
|
||||||
assertForeignKey( "FK_CAR_OWNER3", "OWNER_PERSON_ID3" );
|
assertForeignKey( scope, "FK_STUDENT_CAR3", "CAR_NR3", "CAR_VENDOR_NR3" );
|
||||||
assertForeignKey( "FK_PERSON_CC", "PERSON_CC_ID" );
|
assertNoForeignKey( scope, "FK_STUDENT_CAR2", "CAR_NR2", "CAR_VENDOR_NR2" );
|
||||||
assertNoForeignKey( "FK_CAR_OWNER2", "OWNER_PERSON_ID2" );
|
assertNoForeignKey( scope, "FK_STUDENT_CAR4", "CAR_NR4", "CAR_VENDOR_NR4" );
|
||||||
assertNoForeignKey( "FK_CAR_OWNER4", "OWNER_PERSON_ID4" );
|
|
||||||
assertNoForeignKey( "FK_PERSON_CC2", "PERSON_CC_ID2" );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testJoinColumns() {
|
public void testJoinTable(DomainModelScope scope) {
|
||||||
assertForeignKey( "FK_STUDENT_CAR", "CAR_NR", "CAR_VENDOR_NR" );
|
assertForeignKey( scope, "FK_VEHICLE_BUY_INFOS_STUDENT", "STUDENT_ID" );
|
||||||
assertForeignKey( "FK_STUDENT_CAR3", "CAR_NR3", "CAR_VENDOR_NR3" );
|
|
||||||
assertNoForeignKey( "FK_STUDENT_CAR2", "CAR_NR2", "CAR_VENDOR_NR2" );
|
|
||||||
assertNoForeignKey( "FK_STUDENT_CAR4", "CAR_NR4", "CAR_VENDOR_NR4" );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testJoinTable() {
|
public void testJoinTableInverse(DomainModelScope scope) {
|
||||||
assertForeignKey( "FK_VEHICLE_BUY_INFOS_STUDENT", "STUDENT_ID" );
|
assertForeignKey( scope, "FK_VEHICLE_BUY_INFOS_VEHICLE_BUY_INFO", "VEHICLE_BUY_INFO_ID" );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testJoinTableInverse() {
|
public void testPrimaryKeyJoinColumn(DomainModelScope scope) {
|
||||||
assertForeignKey( "FK_VEHICLE_BUY_INFOS_VEHICLE_BUY_INFO", "VEHICLE_BUY_INFO_ID" );
|
assertForeignKey( scope, "FK_STUDENT_PERSON", "PERSON_ID" );
|
||||||
|
assertNoForeignKey( scope, "FK_PROFESSOR_PERSON", "PERSON_ID" );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPrimaryKeyJoinColumn() {
|
public void testPrimaryKeyJoinColumns(DomainModelScope scope) {
|
||||||
assertForeignKey( "FK_STUDENT_PERSON", "PERSON_ID" );
|
assertForeignKey( scope, "FK_CAR_VEHICLE", "CAR_NR", "VENDOR_NR" );
|
||||||
assertNoForeignKey( "FK_PROFESSOR_PERSON", "PERSON_ID" );
|
assertNoForeignKey( scope, "FK_TRUCK_VEHICLE", "CAR_NR", "VENDOR_NR" );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPrimaryKeyJoinColumns() {
|
public void testCollectionTable(DomainModelScope scope) {
|
||||||
assertForeignKey( "FK_CAR_VEHICLE", "CAR_NR", "VENDOR_NR" );
|
assertForeignKey( scope, "FK_OWNER_INFO_CAR", "CAR_NR", "VENDOR_NR" );
|
||||||
assertNoForeignKey( "FK_TRUCK_VEHICLE", "CAR_NR", "VENDOR_NR" );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCollectionTable() {
|
public void testMapKeyJoinColumn(DomainModelScope scope) {
|
||||||
assertForeignKey( "FK_OWNER_INFO_CAR", "CAR_NR", "VENDOR_NR" );
|
assertForeignKey( scope, "FK_OWNER_INFO_PERSON", "PERSON_ID" );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMapKeyJoinColumn() {
|
public void testMapKeyJoinColumns(DomainModelScope scope) {
|
||||||
assertForeignKey( "FK_OWNER_INFO_PERSON", "PERSON_ID" );
|
assertForeignKey( scope, "FK_VEHICLE_BUY_INFOS_VEHICLE", "VEHICLE_NR", "VEHICLE_VENDOR_NR" );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMapKeyJoinColumns() {
|
public void testMapForeignKeyJoinColumnCollection(DomainModelScope scope) {
|
||||||
assertForeignKey( "FK_VEHICLE_BUY_INFOS_VEHICLE", "VEHICLE_NR", "VEHICLE_VENDOR_NR" );
|
assertForeignKey( scope, "FK_PROPERTIES_TASK", "task_id" );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMapForeignKeyJoinColumnColection() {
|
public void testMapForeignKeyCollection(DomainModelScope scope) {
|
||||||
assertForeignKey( "FK_PROPERTIES_TASK", "task_id" );
|
assertForeignKey( scope, "FK_ATTRIBUTES_TASK", "task_id" );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMapForeignKeyColection() {
|
public void testAssociationOverride(DomainModelScope scope) {
|
||||||
assertForeignKey( "FK_ATTRIBUTES_TASK", "task_id" );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testAssociationOverride() {
|
|
||||||
// class level association overrides
|
// class level association overrides
|
||||||
assertForeignKey( "FK_COMPANY_OWNER", "OWNER_PERSON_ID" );
|
assertForeignKey( scope, "FK_COMPANY_OWNER", "OWNER_PERSON_ID" );
|
||||||
assertForeignKey( "FK_COMPANY_CREDIT_CARD", "CREDIT_CARD_ID" );
|
assertForeignKey( scope, "FK_COMPANY_CREDIT_CARD", "CREDIT_CARD_ID" );
|
||||||
assertForeignKey( "FK_COMPANY_CREDIT_CARD3", "CREDIT_CARD_ID3" );
|
assertForeignKey( scope, "FK_COMPANY_CREDIT_CARD3", "CREDIT_CARD_ID3" );
|
||||||
assertNoForeignKey( "FK_COMPANY_OWNER2", "OWNER_PERSON_ID2" );
|
assertNoForeignKey( scope, "FK_COMPANY_OWNER2", "OWNER_PERSON_ID2" );
|
||||||
assertNoForeignKey( "FK_COMPANY_CREDIT_CARD2", "CREDIT_CARD_ID2" );
|
assertNoForeignKey( scope, "FK_COMPANY_CREDIT_CARD2", "CREDIT_CARD_ID2" );
|
||||||
assertNoForeignKey( "FK_COMPANY_CREDIT_CARD4", "CREDIT_CARD_ID4" );
|
assertNoForeignKey( scope, "FK_COMPANY_CREDIT_CARD4", "CREDIT_CARD_ID4" );
|
||||||
|
|
||||||
// embeddable association overrides
|
// embeddable association overrides
|
||||||
assertForeignKey( "FK_COMPANY_CARD", "AO_CI_CC_ID" );
|
assertForeignKey( scope, "FK_COMPANY_CARD", "AO_CI_CC_ID" );
|
||||||
assertNoForeignKey( "FK_COMPANY_CARD2", "AO_CI_CC_ID2" );
|
assertNoForeignKey( scope, "FK_COMPANY_CARD2", "AO_CI_CC_ID2" );
|
||||||
assertForeignKey( "FK_COMPANY_CARD3", "AO_CI_CC_ID3" );
|
assertForeignKey( scope, "FK_COMPANY_CARD3", "AO_CI_CC_ID3" );
|
||||||
assertNoForeignKey( "FK_COMPANY_CARD4", "AO_CI_CC_ID4" );
|
assertNoForeignKey( scope, "FK_COMPANY_CARD4", "AO_CI_CC_ID4" );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSecondaryTable() {
|
public void testSecondaryTable(DomainModelScope scope) {
|
||||||
assertForeignKey( "FK_CAR_DETAILS_CAR", "CAR_NR", "CAR_VENDOR_NR" );
|
assertForeignKey( scope, "FK_CAR_DETAILS_CAR", "CAR_NR", "CAR_VENDOR_NR" );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertForeignKey(String foreignKeyName, String... columns) {
|
@Test
|
||||||
|
@NotImplementedYet( strict = false, reason = "Problem with non-root-entity based FKs" )
|
||||||
|
public void testGet(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> session.get( Student.class, 1l )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertForeignKey(DomainModelScope scope, String foreignKeyName, String... columns) {
|
||||||
Set<String> columnSet = new LinkedHashSet<>( Arrays.asList( columns ) );
|
Set<String> columnSet = new LinkedHashSet<>( Arrays.asList( columns ) );
|
||||||
for ( Namespace namespace : metadata().getDatabase().getNamespaces() ) {
|
for ( Namespace namespace : scope.getDomainModel().getDatabase().getNamespaces() ) {
|
||||||
for ( org.hibernate.mapping.Table table : namespace.getTables() ) {
|
for ( org.hibernate.mapping.Table table : namespace.getTables() ) {
|
||||||
Iterator<org.hibernate.mapping.ForeignKey> fkItr = table.getForeignKeyIterator();
|
Iterator<org.hibernate.mapping.ForeignKey> fkItr = table.getForeignKeyIterator();
|
||||||
while ( fkItr.hasNext() ) {
|
while ( fkItr.hasNext() ) {
|
||||||
|
@ -189,18 +199,8 @@ public class ForeignKeyConstraintTest extends BaseNonConfigCoreFunctionalTestCas
|
||||||
fail( "ForeignKey '" + foreignKeyName + "' could not be found!" );
|
fail( "ForeignKey '" + foreignKeyName + "' could not be found!" );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
private void assertNoForeignKey(DomainModelScope scope, String foreignKeyName, String... columns) {
|
||||||
public void testGet(){
|
for ( Namespace namespace : scope.getDomainModel().getDatabase().getNamespaces() ) {
|
||||||
inTransaction(
|
|
||||||
session -> {
|
|
||||||
session.get( Student.class, 1l );
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void assertNoForeignKey(String foreignKeyName, String... columns) {
|
|
||||||
Set<String> columnSet = new LinkedHashSet<>( Arrays.asList( columns ) );
|
|
||||||
for ( Namespace namespace : metadata().getDatabase().getNamespaces() ) {
|
|
||||||
for ( org.hibernate.mapping.Table table : namespace.getTables() ) {
|
for ( org.hibernate.mapping.Table table : namespace.getTables() ) {
|
||||||
Iterator<org.hibernate.mapping.ForeignKey> fkItr = table.getForeignKeyIterator();
|
Iterator<org.hibernate.mapping.ForeignKey> fkItr = table.getForeignKeyIterator();
|
||||||
while ( fkItr.hasNext() ) {
|
while ( fkItr.hasNext() ) {
|
||||||
|
@ -324,6 +324,7 @@ public class ForeignKeyConstraintTest extends BaseNonConfigCoreFunctionalTestCas
|
||||||
public static class Vehicle {
|
public static class Vehicle {
|
||||||
@EmbeddedId
|
@EmbeddedId
|
||||||
public VehicleId id;
|
public VehicleId id;
|
||||||
|
public String name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Embeddable
|
@Embeddable
|
||||||
|
|
|
@ -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.orm.test.metamodel.mapping;
|
package org.hibernate.orm.test.mapping;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
|
@ -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.orm.test.metamodel.mapping;
|
package org.hibernate.orm.test.mapping;
|
||||||
|
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
import java.sql.Types;
|
import java.sql.Types;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hibernate.orm.test.metamodel.mapping.array;
|
package org.hibernate.orm.test.mapping.array;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.persistence.ElementCollection;
|
import javax.persistence.ElementCollection;
|
|
@ -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.orm.test.metamodel.mapping.cid.aggregated;
|
package org.hibernate.orm.test.mapping.cid.aggregated;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
|
@ -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.orm.test.metamodel.mapping.cid.nonaggregated;
|
package org.hibernate.orm.test.mapping.cid.nonaggregated;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
|
@ -8,4 +8,4 @@
|
||||||
/**
|
/**
|
||||||
* Testing support of composite identifier mappings
|
* Testing support of composite identifier mappings
|
||||||
*/
|
*/
|
||||||
package org.hibernate.orm.test.metamodel.mapping.cid;
|
package org.hibernate.orm.test.mapping.cid;
|
|
@ -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.orm.test.metamodel.mapping.collections;
|
package org.hibernate.orm.test.mapping.collections;
|
||||||
|
|
||||||
import org.hibernate.Hibernate;
|
import org.hibernate.Hibernate;
|
||||||
import org.hibernate.collection.spi.PersistentCollection;
|
import org.hibernate.collection.spi.PersistentCollection;
|
|
@ -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.orm.test.metamodel.mapping.collections;
|
package org.hibernate.orm.test.mapping.collections;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
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.orm.test.metamodel.mapping.collections;
|
package org.hibernate.orm.test.mapping.collections;
|
||||||
|
|
||||||
import org.hibernate.metamodel.mapping.AttributeMapping;
|
import org.hibernate.metamodel.mapping.AttributeMapping;
|
||||||
import org.hibernate.metamodel.mapping.EntityMappingType;
|
import org.hibernate.metamodel.mapping.EntityMappingType;
|
|
@ -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.orm.test.metamodel.mapping.collections;
|
package org.hibernate.orm.test.mapping.collections;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.hibernate.orm.test.metamodel.mapping.collections;
|
package org.hibernate.orm.test.mapping.collections;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
|
@ -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.orm.test.metamodel.contributed;
|
package org.hibernate.orm.test.mapping.contributed;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
@ -245,7 +245,7 @@ public class BasicContributorTests {
|
||||||
final ClassLoaderService classLoaderService = buildingContext.getBootstrapContext()
|
final ClassLoaderService classLoaderService = buildingContext.getBootstrapContext()
|
||||||
.getServiceRegistry()
|
.getServiceRegistry()
|
||||||
.getService( ClassLoaderService.class );
|
.getService( ClassLoaderService.class );
|
||||||
final InputStream inputStream = classLoaderService.locateResourceStream( "org/hibernate/orm/test/metamodel/contributed/BasicContributorTests.hbm.xml" );
|
final InputStream inputStream = classLoaderService.locateResourceStream( "org/hibernate/orm/test/mapping/contributed/BasicContributorTests.hbm.xml" );
|
||||||
final Binding<JaxbHbmHibernateMapping> jaxbBinding = mappingBinder.bind( inputStream, origin );
|
final Binding<JaxbHbmHibernateMapping> jaxbBinding = mappingBinder.bind( inputStream, origin );
|
||||||
final JaxbHbmHibernateMapping jaxbRoot = jaxbBinding.getRoot();
|
final JaxbHbmHibernateMapping jaxbRoot = jaxbBinding.getRoot();
|
||||||
|
|
|
@ -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.orm.test.metamodel.contributed;
|
package org.hibernate.orm.test.mapping.contributed;
|
||||||
|
|
||||||
import org.hibernate.boot.spi.AdditionalJaxbMappingProducer;
|
import org.hibernate.boot.spi.AdditionalJaxbMappingProducer;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
|
@ -12,6 +12,8 @@ import javax.persistence.criteria.Root;
|
||||||
|
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.internal.CoreMessageLogger;
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
|
import org.hibernate.type.descriptor.JdbcBindingLogging;
|
||||||
|
import org.hibernate.type.descriptor.JdbcExtractingLogging;
|
||||||
import org.hibernate.type.descriptor.sql.BasicBinder;
|
import org.hibernate.type.descriptor.sql.BasicBinder;
|
||||||
import org.hibernate.type.descriptor.sql.BasicExtractor;
|
import org.hibernate.type.descriptor.sql.BasicExtractor;
|
||||||
|
|
||||||
|
@ -36,13 +38,13 @@ public class EnumTypeTest extends BaseCoreFunctionalTestCase {
|
||||||
@Rule
|
@Rule
|
||||||
public LoggerInspectionRule binderLogInspection = new LoggerInspectionRule( Logger.getMessageLogger(
|
public LoggerInspectionRule binderLogInspection = new LoggerInspectionRule( Logger.getMessageLogger(
|
||||||
CoreMessageLogger.class,
|
CoreMessageLogger.class,
|
||||||
BasicBinder.class.getName()
|
JdbcBindingLogging.NAME
|
||||||
) );
|
) );
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public LoggerInspectionRule extractorLogInspection = new LoggerInspectionRule( Logger.getMessageLogger(
|
public LoggerInspectionRule extractorLogInspection = new LoggerInspectionRule( Logger.getMessageLogger(
|
||||||
CoreMessageLogger.class,
|
CoreMessageLogger.class,
|
||||||
BasicExtractor.class.getName()
|
JdbcExtractingLogging.NAME
|
||||||
) );
|
) );
|
||||||
|
|
||||||
private Person person;
|
private Person person;
|
||||||
|
|
|
@ -12,141 +12,130 @@ import javax.persistence.Enumerated;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
|
|
||||||
import org.hibernate.internal.CoreMessageLogger;
|
import org.hibernate.type.descriptor.JdbcBindingLogging;
|
||||||
import org.hibernate.type.descriptor.sql.BasicBinder;
|
|
||||||
import org.hibernate.type.descriptor.sql.BasicExtractor;
|
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
import org.hibernate.testing.logger.LoggerInspectionRule;
|
import org.hibernate.testing.orm.junit.Logger;
|
||||||
import org.hibernate.testing.logger.Triggerable;
|
import org.hibernate.testing.orm.junit.MessageKeyInspection;
|
||||||
import org.junit.Rule;
|
import org.hibernate.testing.orm.junit.MessageKeyWatcher;
|
||||||
import org.junit.Test;
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Vlad Mihacea
|
* @author Vlad Mihacea
|
||||||
*/
|
*/
|
||||||
public class OrdinalEnumTypeTest extends BaseCoreFunctionalTestCase {
|
@MessageKeyInspection(
|
||||||
|
logger = @Logger( loggerName = JdbcBindingLogging.NAME ),
|
||||||
@Rule
|
messageKey = "binding parameter ["
|
||||||
public LoggerInspectionRule binderLogInspection = new LoggerInspectionRule( Logger.getMessageLogger(
|
)
|
||||||
CoreMessageLogger.class,
|
@DomainModel( annotatedClasses = OrdinalEnumTypeTest.Person.class )
|
||||||
BasicBinder.class.getName()
|
@SessionFactory
|
||||||
) );
|
public class OrdinalEnumTypeTest {
|
||||||
|
@BeforeEach
|
||||||
@Rule
|
protected void createTestData(SessionFactoryScope scope) {
|
||||||
public LoggerInspectionRule extractorLogInspection = new LoggerInspectionRule( Logger.getMessageLogger(
|
scope.inTransaction(
|
||||||
CoreMessageLogger.class,
|
(session) -> {
|
||||||
BasicExtractor.class.getName()
|
final Person person = Person.person( Gender.MALE, HairColor.BROWN );
|
||||||
) );
|
session.persist( person );
|
||||||
|
session.persist( Person.person( Gender.MALE, HairColor.BLACK ) );
|
||||||
private Person person;
|
session.persist( Person.person( Gender.FEMALE, HairColor.BROWN ) );
|
||||||
|
session.persist( Person.person( Gender.FEMALE, HairColor.BLACK ) );
|
||||||
private Triggerable binderTriggerable;
|
}
|
||||||
|
);
|
||||||
private Triggerable extractorTriggerable;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Class<?>[] getAnnotatedClasses() {
|
|
||||||
return new Class[] {
|
|
||||||
Person.class
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@AfterEach
|
||||||
protected void prepareTest() {
|
public void dropTestData(SessionFactoryScope scope) {
|
||||||
doInHibernate( this::sessionFactory, s -> {
|
scope.inTransaction(
|
||||||
this.person = Person.person( Gender.MALE, HairColor.BROWN );
|
(session) -> session.createQuery( "delete Person" ).executeUpdate()
|
||||||
s.persist( person );
|
);
|
||||||
s.persist( Person.person( Gender.MALE, HairColor.BLACK ) );
|
|
||||||
s.persist( Person.person( Gender.FEMALE, HairColor.BROWN ) );
|
|
||||||
s.persist( Person.person( Gender.FEMALE, HairColor.BLACK ) );
|
|
||||||
} );
|
|
||||||
|
|
||||||
binderTriggerable = binderLogInspection.watchForLogMessages( "binding parameter" );
|
|
||||||
extractorTriggerable = extractorLogInspection.watchForLogMessages( "extracted value" );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isCleanupTestDataRequired() {
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestForIssue(jiraKey = "HHH-12978")
|
@TestForIssue(jiraKey = "HHH-12978")
|
||||||
public void testEnumAsBindParameterAndExtract() {
|
public void testEnumAsBindParameterAndExtract(SessionFactoryScope scope, MessageKeyWatcher loggingWatcher) {
|
||||||
doInHibernate( this::sessionFactory, s -> {
|
scope.inTransaction(
|
||||||
binderTriggerable.reset();
|
(session) -> {
|
||||||
extractorTriggerable.reset();
|
session.createQuery( "select p.id from Person p where p.id = :id", Long.class )
|
||||||
|
.setParameter( "id", 1 )
|
||||||
|
.list();
|
||||||
|
|
||||||
s.createQuery( "select p.id from Person p where p.id = :id", Long.class )
|
assertTrue( loggingWatcher.wasTriggered() );
|
||||||
.setParameter( "id", person.getId() )
|
}
|
||||||
.getSingleResult();
|
);
|
||||||
|
|
||||||
assertTrue( binderTriggerable.wasTriggered() );
|
loggingWatcher.reset();
|
||||||
assertTrue( extractorTriggerable.wasTriggered() );
|
|
||||||
} );
|
|
||||||
|
|
||||||
doInHibernate( this::sessionFactory, s -> {
|
scope.inTransaction(
|
||||||
binderTriggerable.reset();
|
(session) -> {
|
||||||
extractorTriggerable.reset();
|
final String qry = "select p.gender from Person p where p.gender = :gender and p.hairColor = :hairColor";
|
||||||
|
session.createQuery( qry, Gender.class )
|
||||||
s.createQuery(
|
|
||||||
"select p.gender from Person p where p.gender = :gender and p.hairColor = :hairColor",
|
|
||||||
Gender.class
|
|
||||||
)
|
|
||||||
.setParameter( "gender", Gender.MALE )
|
.setParameter( "gender", Gender.MALE )
|
||||||
.setParameter( "hairColor", HairColor.BROWN )
|
.setParameter( "hairColor", HairColor.BROWN )
|
||||||
.getSingleResult();
|
.getSingleResult();
|
||||||
|
|
||||||
assertTrue( binderTriggerable.wasTriggered() );
|
assertTrue( loggingWatcher.wasTriggered() );
|
||||||
assertTrue( extractorTriggerable.wasTriggered() );
|
}
|
||||||
} );
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestForIssue(jiraKey = "HHH-10282")
|
@TestForIssue(jiraKey = "HHH-10282")
|
||||||
public void hqlTestEnumShortHandSyntax() {
|
public void hqlTestEnumShortHandSyntax(SessionFactoryScope scope, MessageKeyWatcher loggingWatcher) {
|
||||||
doInHibernate( this::sessionFactory, session -> {
|
scope.inTransaction(
|
||||||
|
(session) -> {
|
||||||
session.createQuery(
|
session.createQuery(
|
||||||
"select id from Person where originalHairColor = BLONDE")
|
"select id from Person where originalHairColor = BLONDE")
|
||||||
.getResultList();
|
.getResultList();
|
||||||
} );
|
|
||||||
|
assertTrue( loggingWatcher.wasTriggered() );
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestForIssue(jiraKey = "HHH-10282")
|
@TestForIssue(jiraKey = "HHH-10282")
|
||||||
public void hqlTestEnumQualifiedShortHandSyntax() {
|
public void hqlTestEnumQualifiedShortHandSyntax(SessionFactoryScope scope, MessageKeyWatcher loggingWatcher) {
|
||||||
doInHibernate( this::sessionFactory, session -> {
|
final String qry = "select id from Person where originalHairColor = HairColor.BLONDE";
|
||||||
session.createQuery(
|
scope.inTransaction(
|
||||||
"select id from Person where originalHairColor = HairColor.BLONDE")
|
(session) -> {
|
||||||
.getResultList();
|
session.createQuery( qry ).getResultList();
|
||||||
} );
|
|
||||||
|
assertTrue( loggingWatcher.wasTriggered() );
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestForIssue(jiraKey = "HHH-10282")
|
@TestForIssue(jiraKey = "HHH-10282")
|
||||||
public void hqlTestEnumShortHandSyntaxInPredicate() {
|
public void hqlTestEnumShortHandSyntaxInPredicate(SessionFactoryScope scope, MessageKeyWatcher loggingWatcher) {
|
||||||
doInHibernate( this::sessionFactory, session -> {
|
scope.inTransaction(
|
||||||
session.createQuery(
|
(session) -> {
|
||||||
"select id from Person where originalHairColor in (BLONDE, BROWN)")
|
final String qry = "select id from Person where originalHairColor in (BLONDE, BROWN)";
|
||||||
.getResultList();
|
session.createQuery( qry ).getResultList();
|
||||||
} );
|
|
||||||
|
assertTrue( loggingWatcher.wasTriggered() );
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestForIssue(jiraKey = "HHH-10282")
|
@TestForIssue(jiraKey = "HHH-10282")
|
||||||
public void hqlTestEnumQualifiedShortHandSyntaxInPredicate() {
|
public void hqlTestEnumQualifiedShortHandSyntaxInPredicate(SessionFactoryScope scope, MessageKeyWatcher loggingWatcher) {
|
||||||
doInHibernate( this::sessionFactory, session -> {
|
scope.inTransaction(
|
||||||
session.createQuery(
|
(session) -> {
|
||||||
"select id from Person where originalHairColor in (HairColor.BLONDE, HairColor.BROWN)")
|
final String qry = "select id from Person where originalHairColor in (HairColor.BLONDE, HairColor.BROWN)";
|
||||||
.getResultList();
|
session.createQuery( qry ).getResultList();
|
||||||
} );
|
|
||||||
|
assertTrue( loggingWatcher.wasTriggered() );
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity(name = "Person")
|
@Entity(name = "Person")
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
|
||||||
|
<!--
|
||||||
|
~ 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
|
||||||
|
-->
|
||||||
|
<!DOCTYPE hibernate-mapping PUBLIC
|
||||||
|
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
|
||||||
|
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
|
||||||
|
<hibernate-mapping>
|
||||||
|
|
||||||
|
<class name="org.hibernate.orm.test.mapping.formula.EntityOfFormulas" table="formulas">
|
||||||
|
<id name="id" />
|
||||||
|
<property name="realValue" column="real_value" />
|
||||||
|
<property name="stringFormula" formula="real_value || ' a'" />
|
||||||
|
<property name="integerFormula" formula="real_value + 1" />
|
||||||
|
</class>
|
||||||
|
|
||||||
|
</hibernate-mapping>
|
|
@ -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.mapping.formula;
|
||||||
|
|
||||||
|
public class EntityOfFormulas {
|
||||||
|
private Integer id;
|
||||||
|
private Integer realValue;
|
||||||
|
private String stringFormula;
|
||||||
|
private Integer integerFormula;
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getRealValue() {
|
||||||
|
return realValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRealValue(Integer realValue) {
|
||||||
|
this.realValue = realValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStringFormula() {
|
||||||
|
return stringFormula;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStringFormula(String stringFormula) {
|
||||||
|
this.stringFormula = stringFormula;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getIntegerFormula() {
|
||||||
|
return integerFormula;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIntegerFormula(Integer integerFormula) {
|
||||||
|
this.integerFormula = integerFormula;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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.orm.test.formula;
|
package org.hibernate.orm.test.mapping.formula;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
|
@ -63,6 +63,13 @@ public class FormulaBasicsTest {
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testHqlAmbiguous(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction( session -> {
|
||||||
|
session.createQuery( "select a, b from Account a, Account b" ).list();
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testCriteria(SessionFactoryScope scope) {
|
void testCriteria(SessionFactoryScope scope) {
|
||||||
scope.inTransaction( session -> {
|
scope.inTransaction( session -> {
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* 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.mapping.formula;
|
||||||
|
|
||||||
|
import java.sql.Types;
|
||||||
|
|
||||||
|
import org.hibernate.mapping.BasicValue;
|
||||||
|
import org.hibernate.mapping.Formula;
|
||||||
|
import org.hibernate.mapping.Property;
|
||||||
|
import org.hibernate.mapping.Selectable;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModelScope;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
|
import static org.hamcrest.Matchers.instanceOf;
|
||||||
|
import static org.hamcrest.Matchers.is;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
@DomainModel( xmlMappings = "org/hibernate/orm/test/mapping/formula/EntityOfFormulas.hbm.xml")
|
||||||
|
@SessionFactory
|
||||||
|
public class FormulaFromHbmTests {
|
||||||
|
@Test
|
||||||
|
public void mappingAssertions(DomainModelScope scope) {
|
||||||
|
scope.withHierarchy(
|
||||||
|
EntityOfFormulas.class,
|
||||||
|
(rootClass) -> {
|
||||||
|
final Property stringFormula = rootClass.getProperty( "stringFormula" );
|
||||||
|
{
|
||||||
|
final int[] sqlTypes = stringFormula.getType().sqlTypes( scope.getDomainModel() );
|
||||||
|
assertThat( sqlTypes.length, is( 1 ) );
|
||||||
|
assertThat( sqlTypes[ 0 ], is( Types.VARCHAR ) );
|
||||||
|
|
||||||
|
final Selectable selectable = ( (BasicValue) stringFormula.getValue() ).getColumn();
|
||||||
|
assertThat( selectable, instanceOf( Formula.class ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
final Property integerFormula = rootClass.getProperty( "integerFormula" );
|
||||||
|
{
|
||||||
|
final int[] sqlTypes = integerFormula.getType().sqlTypes( scope.getDomainModel() );
|
||||||
|
assertThat( sqlTypes.length, is( 1 ) );
|
||||||
|
assertThat( sqlTypes[ 0 ], is( Types.INTEGER ) );
|
||||||
|
|
||||||
|
final Selectable selectable = ( (BasicValue) integerFormula.getValue() ).getColumn();
|
||||||
|
assertThat( selectable, instanceOf( Formula.class ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBasicHqlUse(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
(session) -> session.createQuery( "from EntityOfFormulas" ).list()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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.orm.test.formula;
|
package org.hibernate.orm.test.mapping.formula;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -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.orm.test.metamodel.mapping.formula;
|
package org.hibernate.orm.test.mapping.formula;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
|
@ -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.orm.test.formula;
|
package org.hibernate.orm.test.mapping.formula;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
|
@ -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.orm.test.formula;
|
package org.hibernate.orm.test.mapping.formula;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.List;
|
import java.util.List;
|
|
@ -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.orm.test.formula;
|
package org.hibernate.orm.test.mapping.formula;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.List;
|
import java.util.List;
|
|
@ -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.orm.test.metamodel.mapping.inheritance;
|
package org.hibernate.orm.test.mapping.inheritance;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
|
@ -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.orm.test.metamodel.mapping.inheritance;
|
package org.hibernate.orm.test.mapping.inheritance;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
|
@ -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.orm.test.metamodel.mapping.inheritance;
|
package org.hibernate.orm.test.mapping.inheritance;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
|
@ -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.orm.test.metamodel.mapping.inheritance;
|
package org.hibernate.orm.test.mapping.inheritance;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.persistence.DiscriminatorColumn;
|
import javax.persistence.DiscriminatorColumn;
|
|
@ -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.orm.test.metamodel.mapping.inheritance.joined;
|
package org.hibernate.orm.test.mapping.inheritance.joined;
|
||||||
|
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
import java.util.List;
|
import java.util.List;
|
|
@ -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.orm.test.metamodel.mapping.inheritance.joined;
|
package org.hibernate.orm.test.mapping.inheritance.joined;
|
||||||
|
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
import java.util.List;
|
import java.util.List;
|
|
@ -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.orm.test.metamodel.mapping.inheritance.joined;
|
package org.hibernate.orm.test.mapping.inheritance.joined;
|
||||||
|
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
import java.util.List;
|
import java.util.List;
|
|
@ -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.orm.test.metamodel.mapping.inheritance.joined;
|
package org.hibernate.orm.test.mapping.inheritance.joined;
|
||||||
|
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
import java.util.List;
|
import java.util.List;
|
|
@ -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.orm.test.metamodel.mapping.inheritance.tableperclass;
|
package org.hibernate.orm.test.mapping.inheritance.tableperclass;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.persistence.DiscriminatorColumn;
|
import javax.persistence.DiscriminatorColumn;
|
|
@ -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.orm.test.metamodel.mapping.inheritance.tableperclass;
|
package org.hibernate.orm.test.mapping.inheritance.tableperclass;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -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.orm.test.metamodel.mapping.inheritance.tableperclass;
|
package org.hibernate.orm.test.mapping.inheritance.tableperclass;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -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.orm.test.manytomany;
|
package org.hibernate.orm.test.mapping.manytomany;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
|
@ -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.orm.test.manytomany;
|
package org.hibernate.orm.test.mapping.manytomany;
|
||||||
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
|
@ -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.orm.test.manytomany;
|
package org.hibernate.orm.test.mapping.manytomany;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
|
@ -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.orm.test.manytoone;
|
package org.hibernate.orm.test.mapping.manytoone;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
|
@ -20,7 +20,7 @@ import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.hamcrest.MatcherAssert.assertThat;
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.hamcrest.Matchers.is;
|
import static org.hamcrest.Matchers.is;
|
||||||
import static org.hibernate.orm.test.manytoone.ManyToOneBidirectionalCircularityTest.*;
|
import static org.hibernate.orm.test.mapping.manytoone.ManyToOneBidirectionalCircularityTest.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrea Boriero
|
* @author Andrea Boriero
|
|
@ -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.orm.test.manytoone;
|
package org.hibernate.orm.test.mapping.manytoone;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
|
@ -19,17 +19,12 @@ import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.hamcrest.MatcherAssert.assertThat;
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.hamcrest.Matchers.is;
|
import static org.hamcrest.Matchers.is;
|
||||||
import static org.hibernate.orm.test.manytoone.ManyToOneBidirectionalTest.*;
|
import static org.hibernate.orm.test.mapping.manytoone.ManyToOneBidirectionalTest.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrea Boriero
|
* @author Andrea Boriero
|
||||||
*/
|
*/
|
||||||
@DomainModel(
|
@DomainModel( annotatedClasses = { EntityTest.class, EntityTest2.class } )
|
||||||
annotatedClasses = {
|
|
||||||
EntityTest.class,
|
|
||||||
EntityTest2.class
|
|
||||||
}
|
|
||||||
)
|
|
||||||
@SessionFactory(statementInspectorClass = SQLStatementInspector.class)
|
@SessionFactory(statementInspectorClass = SQLStatementInspector.class)
|
||||||
public class ManyToOneBidirectionalTest {
|
public class ManyToOneBidirectionalTest {
|
||||||
|
|
|
@ -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.orm.test.metamodel.mapping.manytoone;
|
package org.hibernate.orm.test.mapping.manytoone;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
|
@ -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.orm.test.metamodel.mapping.manytoone;
|
package org.hibernate.orm.test.mapping.manytoone;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
|
@ -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.orm.test.onetomany;
|
package org.hibernate.orm.test.mapping.onetomany;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
|
@ -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.orm.test.onetomany;
|
package org.hibernate.orm.test.mapping.onetomany;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
|
@ -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.orm.test.onetomany;
|
package org.hibernate.orm.test.mapping.onetomany;
|
||||||
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
|
@ -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.orm.test.onetomany;
|
package org.hibernate.orm.test.mapping.onetomany;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
|
@ -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.orm.test.onetomany;
|
package org.hibernate.orm.test.mapping.onetomany;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
@ -17,9 +17,9 @@ import javax.persistence.ManyToOne;
|
||||||
import javax.persistence.OneToMany;
|
import javax.persistence.OneToMany;
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
|
|
||||||
import org.hibernate.orm.test.onetomany.OneToManyTest.Card;
|
import org.hibernate.orm.test.mapping.onetomany.OneToManyTest.Card;
|
||||||
import org.hibernate.orm.test.onetomany.OneToManyTest.CardField;
|
import org.hibernate.orm.test.mapping.onetomany.OneToManyTest.CardField;
|
||||||
import org.hibernate.orm.test.onetomany.OneToManyTest.Key;
|
import org.hibernate.orm.test.mapping.onetomany.OneToManyTest.Key;
|
||||||
|
|
||||||
import org.hibernate.testing.jdbc.SQLStatementInspector;
|
import org.hibernate.testing.jdbc.SQLStatementInspector;
|
||||||
import org.hibernate.testing.orm.junit.DomainModel;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
|
@ -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.orm.test.metamodel.mapping.onetoone;
|
package org.hibernate.orm.test.mapping.onetoone;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
|
@ -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.orm.test.metamodel.mapping.onetoone;
|
package org.hibernate.orm.test.mapping.onetoone;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
|
@ -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.orm.test.metamodel.mapping.onetoone;
|
package org.hibernate.orm.test.mapping.onetoone;
|
||||||
|
|
||||||
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
|
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
|
||||||
import org.hibernate.metamodel.mapping.ModelPart;
|
import org.hibernate.metamodel.mapping.ModelPart;
|
|
@ -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.orm.test.metamodel.mapping.onetoone;
|
package org.hibernate.orm.test.mapping.onetoone;
|
||||||
|
|
||||||
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
|
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
|
||||||
import org.hibernate.metamodel.mapping.ModelPart;
|
import org.hibernate.metamodel.mapping.ModelPart;
|
|
@ -1,12 +1,12 @@
|
||||||
/*
|
/*
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
*
|
*
|
||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id$
|
//$Id$
|
||||||
package org.hibernate.orm.test.onetoone;
|
package org.hibernate.orm.test.mapping.onetoone;
|
||||||
|
|
||||||
import org.hibernate.AnnotationException;
|
import org.hibernate.AnnotationException;
|
||||||
import org.hibernate.SessionFactory;
|
import org.hibernate.SessionFactory;
|
|
@ -1,10 +1,10 @@
|
||||||
/*
|
/*
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
*
|
*
|
||||||
* 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.orm.test.onetoone;
|
package org.hibernate.orm.test.mapping.onetoone;
|
||||||
|
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
|
@ -1,10 +1,10 @@
|
||||||
/*
|
/*
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
*
|
*
|
||||||
* 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.orm.test.onetoone;
|
package org.hibernate.orm.test.mapping.onetoone;
|
||||||
|
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
|
@ -1,17 +1,11 @@
|
||||||
/*
|
|
||||||
* 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>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
*
|
*
|
||||||
* 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.orm.test.onetoone;
|
|
||||||
|
package org.hibernate.orm.test.mapping.onetoone;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.FetchType;
|
import javax.persistence.FetchType;
|
|
@ -1,10 +1,10 @@
|
||||||
/*
|
/*
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
*
|
*
|
||||||
* 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.orm.test.onetoone;
|
package org.hibernate.orm.test.mapping.onetoone;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
|
@ -1,10 +1,10 @@
|
||||||
/*
|
/*
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
*
|
*
|
||||||
* 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.orm.test.onetoone;
|
package org.hibernate.orm.test.mapping.onetoone;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
|
@ -1,10 +1,10 @@
|
||||||
/*
|
/*
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
*
|
*
|
||||||
* 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.orm.test.onetoone;
|
package org.hibernate.orm.test.mapping.onetoone;
|
||||||
|
|
||||||
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.orm.test.onetoone;
|
package org.hibernate.orm.test.mapping.onetoone;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
|
@ -20,14 +20,12 @@ import org.junit.jupiter.api.Test;
|
||||||
import static org.hamcrest.MatcherAssert.assertThat;
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.hamcrest.Matchers.is;
|
import static org.hamcrest.Matchers.is;
|
||||||
import static org.hamcrest.Matchers.notNullValue;
|
import static org.hamcrest.Matchers.notNullValue;
|
||||||
import static org.hibernate.orm.test.onetoone.ToOneSelfReferenceTest.EntityTest;
|
import static org.hibernate.orm.test.mapping.onetoone.ToOneSelfReferenceTest.EntityTest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrea Boriero
|
* @author Andrea Boriero
|
||||||
*/
|
*/
|
||||||
@DomainModel(annotatedClasses = {
|
@DomainModel( annotatedClasses = { EntityTest.class } )
|
||||||
EntityTest.class
|
|
||||||
})
|
|
||||||
@SessionFactory(statementInspectorClass = SQLStatementInspector.class)
|
@SessionFactory(statementInspectorClass = SQLStatementInspector.class)
|
||||||
public class ToOneSelfReferenceTest {
|
public class ToOneSelfReferenceTest {
|
||||||
|
|
|
@ -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.orm.test.onetoone.hhh9798;
|
package org.hibernate.orm.test.mapping.onetoone.hhh9798;
|
||||||
|
|
||||||
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.orm.test.onetoone.hhh9798;
|
package org.hibernate.orm.test.mapping.onetoone.hhh9798;
|
||||||
|
|
||||||
import javax.persistence.PersistenceException;
|
import javax.persistence.PersistenceException;
|
||||||
|
|
|
@ -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.orm.test.onetoone.hhh9798;
|
package org.hibernate.orm.test.mapping.onetoone.hhh9798;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -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.orm.test.onetoone.hhh9798;
|
package org.hibernate.orm.test.mapping.onetoone.hhh9798;
|
||||||
|
|
||||||
public enum ShipmentState {
|
public enum ShipmentState {
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: A320.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
|
//$Id: A320.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
|
||||||
package org.hibernate.orm.test.onetoone.primarykey;
|
package org.hibernate.orm.test.mapping.onetoone.primarykey;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
import javax.persistence.OneToOne;
|
import javax.persistence.OneToOne;
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: A320.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
|
//$Id: A320.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
|
||||||
package org.hibernate.orm.test.onetoone.primarykey;
|
package org.hibernate.orm.test.mapping.onetoone.primarykey;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//$Id: A320.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
|
//$Id: A320.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
|
||||||
package org.hibernate.orm.test.onetoone.primarykey;
|
package org.hibernate.orm.test.mapping.onetoone.primarykey;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
import javax.persistence.JoinColumn;
|
import javax.persistence.JoinColumn;
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue