使用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取回?