在我的Hibernate应用程序中,我想将Java枚举Map到PostgreSQL枚举,反之亦然。
我的应用程序使用apache-thrift,hibernate/JPA(用于ORM模型),postgresql DB。
Postgresql DB已使用命令定义枚举
CREATE TYPE status_enum AS ENUM ('UNDER-CONSTRUCTION', 'CLOSED', 'OPEN')
字符串
DB最初有一些数据,少数元组具有“UNDER-CONSTRUCTION”状态。
以下是我的解决方案:
枚举Map的自定义类型:
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(hibernate)模型的实体:
@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;
}
}
型
它在插入操作中工作正常,而在检索数据时会抛出错误:第一个月
我尝试了StackOverflow中的每一个给定的参考解决方案,没有人能很好地解决我的问题。
3条答案
按热度按时间jvlzgdj91#
Hibernate在序列化枚举字段的值时使用
Enum
的函数name()
,在反序列化实体时使用Enum.valueOf(...)
。这就是为什么不能在值中使用
"UNDER-CONSTRUCTION"
bvjveswy2#
所以我能弄清楚我错过了什么。基本上,我必须覆盖www.example.com文件中的nullSafeGet和nullSafeSetPsqlEnum.java。
我通过这个java文件找到了解决方案。
所以要么定义自定义UserType,就像在link中定义的那样,要么定义EnumType,这两种方法都对我有用。
在上面的代码PsqlEnum.java中,自定义EnumType I缺少覆盖nullSafeGet。
tjjdgumg3#
下面是可能的解决方案,您还需要覆盖
PsqlEnum
类中的nullSafeGet
。字符串