2011-01-14 29 views
6

我有一个包含一个枚举属性的实体。该属性可以在我的代码库我的类型枚举中的任何一个:坚持原始的Java枚举使用Hibernate

public enum AutomobileType { 
    CAR, TRUCK, MOTORCYCLE 
} 

public enum BoatType { 
    ROW_BOAT,YACHT,SHIP 
} 

@Entity 
public class FooBar { 

    @Enumerated(value=EnumType.ORDINAL) 
    private Enum enumValue; 

    public void setEnumValue(Enum value) { ... } 
    public Enum getEnumValue() { ... } 
} 

这失败的异常,“错误的数据类型:对于输入字符串:‘[B @ f0569a’我改变FooBar的存储属性作为一个整数的作品,但是这不是我需要什么。我需要实际的枚举。如何使这项工作,使枚举可以持续为INT但后来拉出到正确的枚举类型有什么建议?

+0

“关于如何使这项工作,使枚举可以持续为INT但任何建议后拉出到正确的枚举类型?” - 你的意思是,你想存储“1”,然后把它换成AutomobileType? – jpkrohling 2011-01-14 14:04:28

回答

3

您需要为枚举定义custom UserType

+0

这并不适用于JPA,当然只适用于XML配置的Hibernate。 – skaffman 2011-01-14 13:18:05

+0

我认为这是多态枚举的唯一方法,但引用的代码示例应该相应地修改。 – axtavt 2011-01-14 13:23:27

2

通常,您不应该这样做。如果两个(或多个枚举)可以分配给t o同一个领域,然后合并成一个anum。

如果使用继承,如:Vehicle有两个子类 - BoatCar,那么你可以有一个不同的字段中的每个子类 - 毕竟每个枚举的是相关的特定类型。所以:

@Column 
private BoatType boatType; 
0

我不认为这可以很容易与多个枚举类型试图共存在同一个属性。 hibernate如何知道在将字段加载到数据库之外时应该实例化哪个Enum类?

如果你真的想这样做,你需要以某种方式编码枚举类+值每次坚持该物业的时间(使用自定义用户类型为duffymo建议)。

你不能分成两个根据企业的性质,每枚举类一个呢?然后,您可以将enumValue(和enumValue2)声明为正确的类,并且它可以开箱即用。