2017-11-10 173 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; 
    } 
}