在我的Hibernate应用程序中,我想将Java枚举映射到Postgresql枚举,反之亦然。
我的应用程序正在使用apache-thrift,hibernate / JPA(用于ORM模型),postgresql DB。
Postgresql DB使用命令
定义了枚举CREATE TYPE status_enum AS ENUM ('UNDER-CONSTRUCTION', 'CLOSED', 'OPEN')
DB有一些数据,最初很少有元组具有“建筑物”和“建筑物”。状态。
这是我的解决方案:
枚举映射的自定义类型:
public class PsqlEnum extends EnumType {
@Override
public void nullSafeSet(final PreparedStatement st, final Object value, final int index,
final SharedSessionContractImplementor session) throws SQLException {
if(value == null) {
st.setNull( index, Types.OTHER );
}
else {
st.setObject(
index,
value.toString(),
Types.OTHER
);
}
}
}
ORM(休眠)模型的实体:
@Entity
@Table(name = "place")
@TypeDef(
name = "pgsql_enum",
typeClass = PsqlEnum.class
)
public class Place implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id",nullable = false)
@Getter @Setter private Integer id;
@Column(name = "name")
@Getter @Setter private String name;
@Getter
@Setter
@Enumerated(EnumType.STRING)
@Type(type = "pgsql_enum")
@Column(name = "status_level",columnDefinition = "status_enum")
private STATUS status;
}
枚举类:
public enum STATUS{
CLOSED("CLOSED"),
UNDERCONSTRUCTION("UNDER-CONSTRUCTION"),
OPEN("OPEN");
private final String label;
Exposure(String label){
this.label = label;
}
public String getLabel() {
return label;
}
public static STATUS fromLabel(String label){
for(STATUS currentEnum:STATUS.values()){
if(currentEnum.getLabel().equals(label)){
return currentEnum;
}
}
return null;
}
@Override
public String toString() {
return this.label;
}
}
它在插入操作时工作正常,在检索数据时会抛出错误:java.lang.IllegalArgumentException: Unknown name value [UNDER-CONSTRUCTION] for enum class
我在StackOverflow中尝试了每个给定的参考解决方案,没有人能解决我的问题。
答案 0 :(得分:0)
Hibernate在序列化枚举字段的值时使用name()
的函数Enum
,在反序列化实体时使用Enum.valueOf(...)
。
这就是为什么你不能在值中使用"UNDER-CONSTRUCTION"
答案 1 :(得分:0)
所以我能够弄明白我错过了什么。基本上我必须覆盖PsqlEnum.java文件中的nullSafeGet和nullSafeSet。
我按照这个java file达成了解决方案
因此,定义链接中定义的自定义UserType或自定义EnumType都适用于我
在上面的自定义EnumType中的代码PsqlEnum.java中,我忽略了覆盖nullSafeGet。