【发布时间】:2021-07-29 03:22:39
【问题描述】:
我正在使用一个较旧的代码库,该代码库有很多使用这样的枚举的实体(当前使用 Hibernate 3),并带有一个“生成”的 GenericEnumUserType 类:
@Entity
@Table(name = "dog")
@TypeDefs({
@TypeDef(name = "DogEnumType",
typeClass = com.GenericEnumUserType.class,
parameters = {
@Parameter(name = "enumClass", value = "com.DogStateEnum"),
@Parameter(name = "identifierMethod", value = "value"),
// could return different type depending on enum
@Parameter(name = "valueOfMethod", value = "fromValue")
}
)
})
public class Dog implements Serializable {
...
@Type(type = "DogEnumType")
public DogStateEnum getDogState() {
return this.dogState;
}
...
GenericEnumUserType(想法是将 valueOf 方法的 java 返回类型映射到适当的 sql 类型):
public class GenericEnumUserType implements UserType, ParameterizedType {
...
private Method valueOfMethod;
private int[] sqlTypes;
...
public void setParameterValues(Properties parameters) {
// Something along the lines of:
String enumClassName = parameters.getProperty("enumClass");
enumClass = Class.forName(enumClassName).asSubclass(Enum.class);
String identifierMethodName = parameters.getProperty("identifierMethod");
identifierMethod = enumClass.getMethod(identifierMethodName);
identifierType = identifierMethod.getReturnType();
// TypeResolver is now deprecated!!
type = (AbstractSingleColumnStandardBasicType<? extends Object>) new TypeResolver().heuristicType(identifierType.getName(), parameters);
sqlTypes = new int[] { ((AbstractSingleColumnStandardBasicType<?>) type).sqlType() };
String valueOfMethodName = parameters.getProperty("valueOfMethod");
valueOfMethod = enumClass.getMethod(valueOfMethodName, new Class[] { identifierType });
}
...
既然 TypeResolver 已被弃用且没有替代品,那么查找从 java 类型到 sql 类型的映射的适当方法是什么?如果这是不可能的,迁移此类代码的推荐方法是什么?
我可以看到 Hibernate 现在有 org.hibernate.type.EnumType 但实现假定序数/字符串可能很好,但重构更大(还有超过 1 个通用枚举)。
【问题讨论】:
标签: java hibernate hibernate-5.x