2017-11-10 172 views
0

我和對象,它包含一個字段讀寫通用的枚舉休眠

@Column(name = "section", nullable = false) 
@Enumerated(EnumType.STRING) 
private Enum section; 

這樣做的原因是因爲對象是在三個不同的項目所使用的每一個將要提供自己的枚舉。看起來寫對象很容易,但我看不懂,並繼續獲得

Caused by: java.lang.IllegalArgumentException: Unknown name value [BLAH] for enum class [java.lang.Enum] 

這當然是非常有意義的。那麼有沒有什麼辦法可以指定每個項目的值將指向哪個枚舉?

+0

這是否意味着你將有三個不同的項目連接到相同的數據庫? –

+0

他們不會連接到相同的數據庫。父類只有對象,子類是連接到在那裏定義的數據庫的類。 – Quillion

回答

1

您應該在每個項目中分別定義每個枚舉屬性。

最好的辦法是從當前類中刪除枚舉屬性,註釋是類@Embeddable而不是@Entity,並在每個項目中,創造出將其嵌入一個實體類,也宣佈了自己的特定項目的枚舉porperty。

你也可以從當前類中刪除枚舉,使抽象類,與@MappedSuperclass取代@Entity,並有每個項目申報它的一個子類,聲明瞭一個具體項目的枚舉。但是,最好總體設計優先於繼承設計。

如果你需要多態,也就是說,你需要能夠泛指由一整塊的每個項目的實體代碼,你可以有每個項目的實體類實現一個接口:

public interface Sectionable<E extends Enum<E>> { 
    E getSection(); 
    void setSection(E value); 
} 

@Entity 
public class Project1Entity 
implements Sectionable<Section1> { 
    @Embedded 
    private ProjectData data = new ProjectData(); 

    @Column(name = "section", nullable = false) 
    @Enumerated(EnumType.STRING) 
    private Section1 section; 

    public ProjectData getData() { 
     return data; 
    } 

    public void setData(ProjectData newData) { 
     Objects.requireNonNull(newData, "Data cannot be null"); 
     this.data = newData; 
    } 

    @Override 
    public Section1 getSection() { 
     return section; 
    } 

    @Override 
    public void setSection(Section1 section) { 
     Objects.requireNonNull(section, "Section cannot be null"); 
     this.section = section; 
    } 
}