将枚举转换为char

时间:2017-11-07 10:26:26

标签: java hibernate char hibernate-mapping enumerated

我正在开发一个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直到现在才有用,因为我只有两个状态(数据库中的OK = true = 1,DB中的错误=假= 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类型不同。我想。

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

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;
        }
    }

}

并将我的Job类更改为:

@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),因为我有大量数据。

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

1 个答案:

答案 0 :(得分:1)

我建议使用带有-L/usr/local/lib属性的@Enumerated注释,此处EnumType.ORDINAL会为您提供一个ORDINAL0或{ {1}}给出订单的价值在枚举中定义。

所以当你定义:

1

所以我们将在这里:

2

<强> Conculsion:

更改列定义,如下所示:

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; ,有关详细信息,请阅读Hibernate & Enum handling article