休眠 5 到休眠 6.2

问题描述 投票:0回答:1

我目前从 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-envers hibernate-6.x
1个回答
0
投票

这是一个老问题,但我遇到了完全相同的问题,这似乎是 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;
© www.soinside.com 2019 - 2024. All rights reserved.