我正在开发一个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),因为我有大量数据。
有一个人知道我的错误在哪里(或者为什么不以不同的方式做我需要做的事情!)?
答案 0 :(得分:1)
我建议使用带有-L/usr/local/lib
属性的@Enumerated
注释,此处EnumType.ORDINAL
会为您提供一个ORDINAL
,0
或{ {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。