从 Hibernate 5.2.7(2017 年 1 月 24 日)开始,此警告更改为:
警告 org.hibernate.type.descriptor.java.JavaTypeDescriptorRegistry -
HHH000481:遇到的 Java 类型 [class SomeClass] for which
我们找不到 JavaTypeDescriptor 并且它似乎没有
实现equals和/或hashCode。这可能导致显着
执行相等/脏检查时的性能问题涉及
这种 Java 类型。考虑注册一个自定义 JavaTypeDescriptor 或
至少实现equals/hashCode。
所以,有以下解决方案:
1) 确保您的类型实现了equals 和hashcode,并使用Immutable.class 对其进行注释,以防它是不可变的。 Hibernate 将使用回退 (defined here)。
2) 实现特定的 java-type-descriptor,如 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 实现可序列化。然后 Hibernate 会使用序列化对象的字节数组比较进行脏检查等,这不是很好。
另见: