Возникла проблема HHH-11097 , исправленная для Hibernate 5.2.3, которая также должна решить вашу проблему:
В при этом коммите , BlobTypeDescriptor
(и другие) получают переопределение для extractLoggableRepresentation
:
@Override
public String extractLoggableRepresentation(Blob value) {
return value == null ? "null" : "BLOB{...}";
}
Реализация по умолчанию (вызывающая вашу проблему) теперь переопределена, выглядит следующим образом:
@Override
public String extractLoggableRepresentation(T value) {
return (value == null) ? "null" : value.toString();
}
Это должно удалить эти гигантские линии из вашего журнала.
Если вы используете последнюю версию hibernate, вы, скорее всего, используете материализованные массивы больших двоичных объектов / примитивные байты (byte[]
). Дескриптор типа, отвечающий за это: PrimitiveByteArrayTypeDescriptor , который безумно реализует метод extractLoggableRepresentation
следующим образом:
@Override
public String extractLoggableRepresentation(byte[] value) {
return (value == null) ? super.extractLoggableRepresentation( null ) : Arrays.toString( value );
}
Единственные решения, которые я вижу в этом случае, это
- Сообщить об ошибке
- Предотвращение использования материализованных капель.
- Используйте обходной путь, внедрив пользовательский
UserType
:
Пользовательский UserType
должен реализовать nullSafeSet
и передать пользовательский JavaTypeDescriptor
в механизм связывания, который выполняет привязку и ведение журнала:
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index,
final SharedSessionContractImplementor session) throws HibernateException, SQLException {
// Simply do what
// org.hibernate.type.AbstractStandardBasicType.nullSafeSet(PreparedStatement, Object, int, WrapperOptions)
// does, but using a custom descriptor.
session.remapSqlTypeDescriptor(MaterializedBlobType.INSTANCE.getSqlTypeDescriptor())
.getBinder(CustomPrimitiveByteArrayTypeDescriptor.INSTANCE)
.bind(st, (byte[]) value, index, session);
}
Пользовательский JavaTypeDescriptor
просто расширяет PrimitiveByteArrayTypeDescriptor
и переопределяет проблемный extractLoggableRepresentation
метод:
public class CustomPrimitiveByteArrayTypeDescriptor extends PrimitiveByteArrayTypeDescriptor {
public static final CustomPrimitiveByteArrayTypeDescriptor INSTANCE = new CustomPrimitiveByteArrayTypeDescriptor();
@Override
public String extractLoggableRepresentation(byte[] value) {
if (null == value) {
return super.extractLoggableRepresentation(value);
} else {
return "byte[" + value.length + "]";
}
}
}