[英]How to map JAVA enum to Postgresql Enum using Hibernate/JPA?
在我的 Hibernate 应用程序中,我想将 Java 枚举映射到 Postgresql 枚举,反之亦然。
我的应用程序使用 apache-thrift、hibernate/JPA(用于 ORM 模型)、postgresql DB。
Postgresql DB 使用命令定义了枚举
CREATE TYPE status_enum AS ENUM ('UNDER-CONSTRUCTION', 'CLOSED', 'OPEN')
数据库最初有一些数据,很少有元组具有“建设中”状态。
这是我的解决方案:
枚举映射的自定义类型:
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 中尝试了每个给定的参考解决方案,但没有人能很好地解决我的问题。
Hibernate 在序列化枚举字段的值时使用Enum
函数name()
,在反序列化实体时使用Enum.valueOf(...)
。
这就是为什么你不能在值中使用"UNDER-CONSTRUCTION"
所以我能够弄清楚我错过了什么。 基本上我必须在 PsqlEnum.java 文件中覆盖 nullSafeGet 和 nullSafeSet。
我按照这个java 文件找到了解决方案。
因此,要么像在链接中定义的那样定义自定义 UserType,要么自定义 EnumType 都对我有用。
在自定义 EnumType 中的上述代码 PsqlEnum.java 中,我缺少覆盖 nullSafeGet。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.