作为休眠5.2.7的(2017年1月24日)此警告更改为:
WARN org.hibernate.type.descriptor.java.JavaTypeDescriptorRegistry - HHH000481:遇到Java类型[类SomeClass的]其中 我们找不到一个JavaTypeDescriptor,而哪一个没有出现在 实现equals和/或hashCode。当执行包含此Java类型的 的相等/脏检查时,这可能会导致显着的性能问题 。考虑注册一个自定义的JavaTypeDescriptor或至少实现equals/hashCode的 。
因此,有这些解决方案:
1)确保您的类型实现equals
和hashcode
,同时还与Immutable.class
的情况下,它是不可改变的注释吧。休眠将使用后备(defined here)。
2)实现特定的Java类型描述符,就像SomePersistentClassTypeDescriptor
:
JavaTypeDescriptorRegistry.INSTANCE
.addDescriptor(new SomePersistentClassTypeDescriptor());
您可以扩展AbstractTypeDescriptor
。如果你的类型是不可变的一个例子:
public class SomePersistentClassTypeDescriptor
extends AbstractTypeDescriptor<SomePersistentClass> {
public SomePersistentClassTypeDescriptor() {
super(SomePersistentClass.class);
}
@Override
public String toString(SomePersistentClassvalue) {
return (value == null) ? null : value.toString();
}
@Override
public SomePersistentClassfromString(String string) {
return (string == null) ? null : SomePersistentClass.getInstance(string);
}
@Override
public <X> X unwrap(SomePersistentClass value, Class<X> type, WrapperOptions options) {
if (value == null) return null;
else if (String.class.isAssignableFrom(type)) {
return (X)value.toString();
}
else throw unknownUnwrap(type);
}
@Nullable
@Override
public <X> SomePersistentClass wrap(X value, WrapperOptions options)
{
if (value == null) return null;
if (String.class.isInstance(value)) {
return SomePersistentClass.getInstance(((String)value));
}
throw unknownWrap(value.getClass());
}
}
如果你喜欢的类型,但是,是可变的,提供自己的MutabilityPlan
:
public class SomePersistentClassTypeDescriptor
extends AbstractTypeDescriptor<SomePersistentClass> {
public SomePersistentClassTypeDescriptor() {
super(SomePersistentClass.class, new MyMutabilityPlan());
}
...
}
3)作出SomePersistentClass
实现Serializable。然后Hibernate会使用序列化对象的字节数组比较来进行脏检等,这不是很好。
此外,见:
具有相同的问题;我使用了10多个AttributeConverters,但其中只有两个似乎受到影响。另一个AttributeConverters从简单类型转换为数据库列(例如数组),但是这两个使用复杂类型(例如POJO)来进行字符串(Json)转换。 – krisy