簡體   English   中英

從數據庫(JPA)中讀取ENUM及其字段

[英]Read ENUM and its fields from a database (JPA)

我有一個模型對象,實際上是一個包含字段和getter的枚舉:

@Entity
public enum Type {
   TYPE1, TYPE2, TYPE3, TYPE4;

   @Column
   private Long id;
   @Column
   private String name;
   ...

   public String getName() {
      return this.name;
   }
   ...
}

它編譯並運行良好。 但是,如果我調用getter方法,它將返回null(它不會加載存儲在數據庫中的任何值)。 這是標准行為嗎? 有沒有辦法讓JPA加載它們?

我想說這種方法存在一些誤解:

  1. 實體表示可以存儲在數據庫中的對象。 在這種情況下,數據庫(或任何其他持久性存儲)定義哪些實例可用。

  2. 枚舉表示源代碼中定義的一組固定常量。 因此,類本身定義了哪些常量可用。 此外,更改枚舉值(即您的案例中的名稱或ID)通常是不好的做法。

你會發現它們是兩個完全不同的概念,應該區別對待。

要在實體中存儲枚舉(枚舉是該實體的字段),您可以使用@Enumerated並存儲枚舉的名稱或序號,或者(我們經常做的)存儲其中一個字段(我們主要使用id)並提供轉換方法。

如果你想在數據庫中存儲可配置的“常量”,你可以嘗試使用普通實體,使構造函數成為私有(Hibernate和其他JPA提供者應該能夠處理它)並提供Enum類的替代實現(你不能使用enum關鍵字)。

你看過@Enumerated注釋了嗎? 我從來沒有試過在枚舉本身中使用它,但是它可以很好地將類屬性綁定到枚舉。

enum Type{TYPE1, TYPE2}

@Column(name="type")
@Enumerated(EnumType.STRING)
public Type getType(){return type;}
public void setType(Type t){type = t;}

如果無法使JPA處理此問題,則可以將一個public Type valueOf(long id)方法添加到您的枚舉類中,該類用作工廠來實例化表示舊表中值的枚舉實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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