簡體   English   中英

如何使用 Hibernate/JPA 將 JAVA 枚舉映射到 Postgresql 枚舉?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM