1

我正在研究一个 Hibernate 项目,这是我的课程的摘录:

@Entity
@Table(name = "T_JOB")
@SequenceGenerator(name = "seqJob", sequenceName = "SEQ_JOB", allocationSize = 1)
@Getter
@Setter
public class Job {

    @Convert(converter = HibernateBooleenVersCaractere.class)
    @Column(name = "STATUT_EXTRACTION")
    private boolean statutExtraction;
}

在我的数据库中,STATUT_EXTRACTION 是一个 CHAR 类型,这就是我使用转换器(HibernateBooleenVersCaractere 实现 AttributeConverter)的原因,它工作得很好。直到现在,布尔 statutExtraction 很有用,因为我只有两个状态(DB 中的 OK = true = 1,DB 中的 Error = false = 0)。但现在我想添加一个状态。为此,我创建了一个枚举状态并使用了枚举类型:

@Entity
@Table(name = "T_JOB")
@SequenceGenerator(name = "seqJob", sequenceName = "SEQ_JOB", allocationSize = 1)
@Getter
@Setter
public class Job {
    public enum Statut {
        ERROR, OK, LOAD
    }

    @Column(name = "STATUT_EXTRACTION")
    @Enumerated(EnumType.STRING)
    private Statut statutExtraction;
}

在这里,我猜到了由 EnumType 与数据库中的 STATUT_EXTRACTION 类型不同引起的错误。

我有第二个想法:使用转换器,就像我将布尔值转换为字符一样:

public class HibernateEnumVersChar
        implements
        AttributeConverter<Statut, Character> {

    @Override
    public Character convertToDatabaseColumn(final Statut statut) {
        if (statut == Statut.OK) {
            return '1';
        } else if (statut == Statut.LOAD) {
            return '2';
        } else if (statut == Statut.ERROR) {
            return '0';
        } else {
            return null;
        }

    }

    @Override
    public Statut convertToEntityAttribute(final Character dbData) {
        if (dbData == '1') {
            return Statut.OK;
        } else if (dbData == '2') {
            return Statut.LOAD;
        } else if (dbData == '0') {
            return Statut.ERROR;
        } else {
            return null;
        }
    }

}

并将我的工作课程更改为:

@Entity
@Table(name = "T_JOB")
@SequenceGenerator(name = "seqJob", sequenceName = "SEQ_JOB", allocationSize = 1)
@Getter
@Setter
public class Job {
    public enum Statut {
        ERROR, OK, LOAD
    }

    @Convert(converter = HibernateEnumVersChar.class)
    @Column(name = "STATUT_EXTRACTION")
    private Statut statutExtraction;
}

在这里我有这个错误:

尝试应用 AttributeConverter 时出错

遗憾的是我无法更改数据库类型(char),因为我有很多数据。

有人知道我的错误在哪里(或者为什么不以不同的方式来做我需要做的事情!)?

4

1 回答 1

1

我在这里建议的是使用@Enumerated带有属性的注释EnumType.ORDINALORDINAL这里会给你一个数字01或者2给出在枚举中定义的值的顺序。

所以当你定义:

public enum Statut {
    ERROR, OK, LOAD
}

所以在这里我们将有:

Statut.ERROR.ordinal()  ---> gives 0
Statut.OK.ordinal()  ---> gives 1
Statut.LOAD.ordinal()  ---> gives 2

结论:

像这样更改列定义:

@Enumerated(EnumType.ORDINAL)
@Column(name = "STATUT_EXTRACTION")
private Statut statutExtraction;

笔记:

数据库列应更改为NUMBER(1,0),或者您可以将其转换为CharEnum 定义中的一个,请阅读Hibernate & Enum 处理文章了解更多详细信息。

于 2017-11-07T10:57:51.340 回答