使用Hibernate持久化原始Java枚举
我有一个包含枚举属性的实体。该属性可以是代码库中的任何枚举类型:使用Hibernate持久化原始Java枚举,java,hibernate,jpa,enums,Java,Hibernate,Jpa,Enums,我有一个包含枚举属性的实体。该属性可以是代码库中的任何枚举类型: 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
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,但稍后将其拉入正确的枚举类型,有何建议?您需要为枚举定义一个值。通常,您不应该这样做。如果(或多个枚举)可以分配给同一字段,然后将它们合并为一个anum 如果您使用继承,例如:
Vehicle
和两个子类--Boat
和Car
,那么您可以在每个子类中有一个不同的字段,毕竟这些枚举中的每一个都只与特定类型相关。因此:
@Column
private BoatType boatType;
我认为,对于试图在同一个属性中共存的多个枚举类型来说,这并不容易。当hibernate从数据库中加载字段时,它如何知道应该实例化哪个枚举类 如果您真的想这样做,您需要在每次保存此属性时以某种方式对enum类+值进行编码(使用duffymo建议的自定义用户类型)
你能不能把它分成两个属性,每个枚举类一个?然后你可以声明enumValue(和enumValue2)作为正确的类,它将开箱即用。这当然不适用于JPA,只适用于XML配置的Hibernate。我认为这是多态枚举的唯一方法,尽管引用的代码示例应该相应地修改。JPA没有用于自定义列/属性绑定的标准,这有点可笑。你知道吗必须在实体中手动执行此操作,方法是拥有两组属性并将其中一组标记为瞬态。@Bozho:他想在同一个属性中存储不同的枚举。我认为OP的意思是他实际上想使用多态的
枚举
,而不是特定的枚举类型。如果我理解这个问题,codecraig不会试图持久化一个特定的枚举,但不包括任何。“关于如何使此工作正常,从而使枚举可以作为int持久化,但稍后会被拉入正确的枚举类型,有什么建议吗?”-您的意思是,要存储“1”,然后将其作为AutomobileType取回?