gpt4 book ai didi

java - 如何使用 Hibernate/JPA 将 JAVA 枚举映射到 Postgresql 枚举?

转载 作者:行者123 更新时间:2023-11-29 12:24:41 25 4
gpt4 key购买 nike

在我的 Hibernate 应用程序中,我想将 Java 枚举映射到 Postgresql 枚举,反之亦然。

我的应用程序正在使用 apache-thrift、hibernate/JPA(用于 ORM 模型)、postgresql 数据库。

Postgresql DB 已经使用命令定义了枚举

CREATE TYPE status_enum AS ENUM ('UNDER-CONSTRUCTION', 'CLOSED', 'OPEN')

DB 有一些数据,最初很少有元组处于“ build 中”状态。

这是我的解决方案:

枚举映射的自定义类型:

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;
}
}

它在插入操作上工作正常,而在检索数据时抛出错误:java.lang.IllegalArgumentException: Unknown name value [UNDER-CONSTRUCTION] for enum class

我在 StackOverflow 中尝试了所有给定的引用解决方案,但没有人能很好地解决我的问题。

最佳答案

Hibernate 在序列化枚举字段的值时使用 Enum 的函数 name(),在序列化枚举字段的值时使用 Enum.valueOf(...)是反序列化实体。

这就是为什么你不能在值中使用 "UNDER-CONSTRUCTION"

关于java - 如何使用 Hibernate/JPA 将 JAVA 枚举映射到 Postgresql 枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47014957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com