[英]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.