我目前从 hibernate 5 迁移到 6
我将 envers 与我的自定义修订表一起使用,其中包含这样的字段 RevisionType
class MyCustomRevision {
...
...
RevisionType revisionType;
}
当我保存实体时,我的 BDD 中有 0/1 或 2。
迁移休眠后说:
class org.hibernate.envers.RevisionType cannot be cast to class java.lang.Byte (org.hibernate.envers.RevisionType is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader
我已将日志
org.hibernate.orm.jdbc.bind
激活到 TRACE,我可以看到 hibernate 尝试将我的 revision_type 与 ADD
、MOD
或 DEL
绑定,而不是序数值。
[TRACE] [http-nio-8080-exec-3] org.hibernate.orm.jdbc.bind - binding parameter [10] as [TINYINT] - [ADD]
我尝试用
强制列定义@Enumerated
@Column(columnDefinition = "smallint")
RevisionType revisionType;
但同样的错误,我有大约 700 个实体,所以我希望有与以前相同的行为
感谢您的帮助
这是一个老问题,但我遇到了完全相同的问题,这似乎是 Hibernate 6 中枚举的普遍问题,所以我按照这篇文章的建议来修复它 @Enumerated(EnumType.STRING) 丢失了@AttributeOverride
所以我添加了一个像这样的转换器
@Converter(autoApply = true) // <-- makes it apply to all RevisionType columns
public class RevisionTypeConverter implements AttributeConverter<RevisionType, Integer> {
@Override
public Integer convertToDatabaseColumn(RevisionType attribute) {
if (attribute == null) {
return null;
}
return attribute.ordinal();
}
@Override
public RevisionType convertToEntityAttribute(Integer dbData) {
if (dbData == null || dbData < 0 || dbData >= RevisionType.values().length) {
return null;
}
return RevisionType.values()[dbData];
}
}
列定义变为
//@Enumerated(EnumType.ORDINAL) // <-- no longer works in Hibernate 6
@Column(columnDefinition = "smallint")
RevisionType revisionType;