Use WrapperOptions for JdbcLiteralFormatter instead of SessionImplementor

This commit is contained in:
Christian Beikov 2020-12-01 11:58:09 +01:00
parent 817bf95a9a
commit fa5d2d9e08
12 changed files with 93 additions and 1152 deletions

View File

@ -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.engine.spi;
import java.util.TimeZone;
import org.hibernate.engine.jdbc.LobCreator;
import org.hibernate.type.descriptor.WrapperOptions;
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
/**
* @author Christian Beikov
* @author Andrea Boriero
*/
public abstract class AbstractDelegatingWrapperOptions implements WrapperOptions {
/**
* Returns the underlying session delegate.
*/
protected abstract SessionImplementor delegate();
@Override
public boolean useStreamForLobBinding() {
return delegate().useStreamForLobBinding();
}
@Override
public LobCreator getLobCreator() {
return delegate().getLobCreator();
}
@Override
public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) {
return delegate().remapSqlTypeDescriptor( sqlTypeDescriptor );
}
@Override
public TimeZone getJdbcTimeZone() {
return delegate().getJdbcTimeZone();
}
}

View File

@ -19,9 +19,10 @@
import org.hibernate.SortOrder;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.engine.spi.AbstractDelegatingWrapperOptions;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.engine.spi.SessionLazyDelegatorBaseImpl;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.internal.FilterJdbcParameter;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.Stack;
@ -93,6 +94,7 @@
import org.hibernate.sql.exec.internal.JdbcParametersImpl;
import org.hibernate.sql.exec.spi.JdbcParameterBinder;
import org.hibernate.type.IntegerType;
import org.hibernate.type.descriptor.WrapperOptions;
import org.hibernate.type.descriptor.sql.JdbcLiteralFormatter;
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
import org.hibernate.type.descriptor.sql.SqlTypeDescriptorIndicators;
@ -124,7 +126,7 @@ public abstract class AbstractSqlAstWalker
private final Dialect dialect;
private transient AbstractSqmSelfRenderingFunctionDescriptor castFunction;
private transient LazySession session;
private transient LazySessionWrapperOptions lazySessionWrapperOptions;
public Dialect getDialect() {
return dialect;
@ -150,11 +152,11 @@ protected AbstractSqmSelfRenderingFunctionDescriptor castFunction() {
return castFunction;
}
protected SessionLazyDelegatorBaseImpl getSession() {
if ( session == null ) {
session = new LazySession( sessionFactory );
protected WrapperOptions getWrapperOptions() {
if ( lazySessionWrapperOptions == null ) {
lazySessionWrapperOptions = new LazySessionWrapperOptions( sessionFactory );
}
return session;
return lazySessionWrapperOptions;
}
/**
@ -162,12 +164,12 @@ protected SessionLazyDelegatorBaseImpl getSession() {
* Usually, only the {@link org.hibernate.type.descriptor.WrapperOptions} interface is needed,
* but for creating LOBs, it might be to have a full blown session.
*/
private static class LazySession extends SessionLazyDelegatorBaseImpl {
private static class LazySessionWrapperOptions extends AbstractDelegatingWrapperOptions {
private final SessionFactoryImplementor sessionFactory;
private SessionImplementor session;
public LazySession(SessionFactoryImplementor sessionFactory) {
public LazySessionWrapperOptions(SessionFactoryImplementor sessionFactory) {
this.sessionFactory = sessionFactory;
}
@ -186,6 +188,11 @@ protected SessionImplementor delegate() {
return session;
}
@Override
public SharedSessionContractImplementor getSession() {
return delegate();
}
@Override
public boolean useStreamForLobBinding() {
return sessionFactory.getFastSessionServices().useStreamForLobBinding();
@ -205,9 +212,9 @@ public TimeZone getJdbcTimeZone() {
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// for tests, for now
public String getSql() {
if ( session != null ) {
session.cleanup();
session = null;
if ( lazySessionWrapperOptions != null ) {
lazySessionWrapperOptions.cleanup();
lazySessionWrapperOptions = null;
}
return sqlBuffer.toString();
}
@ -1365,7 +1372,7 @@ private void visitLiteral(Literal literal) {
literalFormatter.toJdbcLiteral(
literal.getLiteralValue(),
dialect,
getSession()
getWrapperOptions()
)
);
}

View File

@ -13,7 +13,6 @@
import java.sql.Types;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.type.descriptor.ValueBinder;
import org.hibernate.type.descriptor.ValueExtractor;
import org.hibernate.type.descriptor.WrapperOptions;
@ -66,14 +65,14 @@ public <T> JdbcLiteralFormatter<T> getJdbcLiteralFormatter(JavaTypeDescriptor<T>
//we are in the legacy Boolean-to-BIT JDBC type mapping mode
return new BasicJdbcLiteralFormatter( javaTypeDescriptor ) {
@Override
public String toJdbcLiteral(Object value, Dialect dialect, SharedSessionContractImplementor session) {
Boolean bool = unwrap( value, Boolean.class, session );
public String toJdbcLiteral(Object value, Dialect dialect, WrapperOptions wrapperOptions) {
Boolean bool = unwrap( value, Boolean.class, wrapperOptions );
return bool ? "1" : "0";
}
};
}
else {
return (value, dialect, session) -> value.toString();
return (value, dialect, wrapperOptions) -> value.toString();
}
}

View File

@ -7,8 +7,7 @@
package org.hibernate.type.descriptor.sql;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
import org.hibernate.type.descriptor.WrapperOptions;
/**
* A formatter object for creating JDBC literals of a given type.
@ -25,5 +24,5 @@
public interface JdbcLiteralFormatter<T> {
String NULL = "null";
String toJdbcLiteral(T value, Dialect dialect, SharedSessionContractImplementor session);
String toJdbcLiteral(T value, Dialect dialect, WrapperOptions wrapperOptions);
}

View File

@ -70,7 +70,7 @@ default <T> BasicJavaDescriptor<T> getJdbcRecommendedJavaTypeMapping(TypeConfigu
* todo (6.0) : move to {@link org.hibernate.metamodel.mapping.JdbcMapping}?
*/
default <T> JdbcLiteralFormatter<T> getJdbcLiteralFormatter(JavaTypeDescriptor<T> javaTypeDescriptor) {
return (value, dialect, session) -> value.toString();
return (value, dialect, wrapperOptions) -> value.toString();
}
/**

View File

@ -7,7 +7,7 @@
package org.hibernate.type.descriptor.sql.internal;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.type.descriptor.WrapperOptions;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
import org.hibernate.type.descriptor.sql.spi.BasicJdbcLiteralFormatter;
@ -22,7 +22,7 @@ public JdbcLiteralFormatterBinary(JavaTypeDescriptor javaTypeDescriptor) {
}
@Override
public String toJdbcLiteral(Object value, Dialect dialect, SharedSessionContractImplementor session) {
return dialect.formatBinaryliteral( unwrap( value, byte[].class, session ) );
public String toJdbcLiteral(Object value, Dialect dialect, WrapperOptions wrapperOptions) {
return dialect.formatBinaryliteral( unwrap( value, byte[].class, wrapperOptions ) );
}
}

View File

@ -7,7 +7,7 @@
package org.hibernate.type.descriptor.sql.internal;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.type.descriptor.WrapperOptions;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
import org.hibernate.type.descriptor.sql.spi.BasicJdbcLiteralFormatter;
@ -22,7 +22,7 @@ public JdbcLiteralFormatterBoolean(JavaTypeDescriptor javaTypeDescriptor) {
}
@Override
public String toJdbcLiteral(Object value, Dialect dialect, SharedSessionContractImplementor session) {
return dialect.toBooleanValueString( unwrap( value, Boolean.class, session ) );
public String toJdbcLiteral(Object value, Dialect dialect, WrapperOptions wrapperOptions) {
return dialect.toBooleanValueString( unwrap( value, Boolean.class, wrapperOptions ) );
}
}

View File

@ -6,10 +6,8 @@
*/
package org.hibernate.type.descriptor.sql.internal;
import java.util.Locale;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.type.descriptor.WrapperOptions;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
import org.hibernate.type.descriptor.sql.spi.BasicJdbcLiteralFormatter;
@ -33,8 +31,8 @@ public JdbcLiteralFormatterCharacterData(JavaTypeDescriptor javaTypeDescriptor,
}
@Override
public String toJdbcLiteral(Object value, Dialect dialect, SharedSessionContractImplementor session) {
final String literalValue = unwrap( value, String.class, session );
public String toJdbcLiteral(Object value, Dialect dialect, WrapperOptions wrapperOptions) {
final String literalValue = unwrap( value, String.class, wrapperOptions );
final String inlineLiteral = dialect.inlineLiteral( literalValue );

View File

@ -7,7 +7,7 @@
package org.hibernate.type.descriptor.sql.internal;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.type.descriptor.WrapperOptions;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
import org.hibernate.type.descriptor.sql.spi.BasicJdbcLiteralFormatter;
@ -25,7 +25,7 @@ public JdbcLiteralFormatterNumericData(
}
@Override
public String toJdbcLiteral(Object value, Dialect dialect, SharedSessionContractImplementor session) {
return unwrap( value, unwrapJavaType, session ).toString();
public String toJdbcLiteral(Object value, Dialect dialect, WrapperOptions wrapperOptions) {
return unwrap( value, unwrapJavaType, wrapperOptions ).toString();
}
}

View File

@ -11,7 +11,7 @@
import javax.persistence.TemporalType;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.type.descriptor.WrapperOptions;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
import org.hibernate.type.descriptor.sql.spi.BasicJdbcLiteralFormatter;
@ -27,13 +27,13 @@ public JdbcLiteralFormatterTemporal(JavaTypeDescriptor javaTypeDescriptor, Tempo
}
@Override
public String toJdbcLiteral(Object value, Dialect dialect, SharedSessionContractImplementor session) {
public String toJdbcLiteral(Object value, Dialect dialect, WrapperOptions wrapperOptions) {
final TimeZone jdbcTimeZone;
if ( session == null || session.getJdbcTimeZone() == null ) {
if ( wrapperOptions == null || wrapperOptions.getJdbcTimeZone() == null ) {
jdbcTimeZone = TimeZone.getDefault();
}
else {
jdbcTimeZone = session.getJdbcTimeZone();
jdbcTimeZone = wrapperOptions.getJdbcTimeZone();
}
// for performance reasons, avoid conversions if we can
if ( value instanceof java.util.Date ) {
@ -61,21 +61,21 @@ else if ( value instanceof TemporalAccessor ) {
switch ( precision) {
case DATE: {
return dialect.formatDateTimeLiteral(
unwrap( value, java.sql.Date.class, session ),
unwrap( value, java.sql.Date.class, wrapperOptions ),
precision,
jdbcTimeZone
);
}
case TIME: {
return dialect.formatDateTimeLiteral(
unwrap( value, java.sql.Time.class, session ),
unwrap( value, java.sql.Time.class, wrapperOptions ),
precision,
jdbcTimeZone
);
}
default: {
return dialect.formatDateTimeLiteral(
unwrap( value, java.util.Date.class, session ),
unwrap( value, java.util.Date.class, wrapperOptions ),
precision,
jdbcTimeZone
);

View File

@ -7,7 +7,7 @@
package org.hibernate.type.descriptor.sql.spi;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.type.descriptor.WrapperOptions;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
/**
@ -21,7 +21,7 @@ public BasicJdbcLiteralFormatter(JavaTypeDescriptor<?> javaTypeDescriptor) {
}
@SuppressWarnings("unchecked")
protected <X> X unwrap(Object value, Class<X> unwrapType, SharedSessionContractImplementor session) {
protected <X> X unwrap(Object value, Class<X> unwrapType, WrapperOptions wrapperOptions) {
assert value != null;
// for performance reasons, avoid conversions if we can
@ -29,6 +29,6 @@ protected <X> X unwrap(Object value, Class<X> unwrapType, SharedSessionContractI
return (X) value;
}
return (X) getJavaTypeDescriptor().unwrap( value, unwrapType, session );
return (X) getJavaTypeDescriptor().unwrap( value, unwrapType, wrapperOptions );
}
}