使用Hibernate持久化原始Java Enum

时间:2011-01-14 13:12:25

标签: 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 setEnumValue(Enum value) { ... }
  public Enum getEnumValue() { ... }
}

这失败,但有一个例外,“错误的数据类型:对于输入字符串:”[B @ f0569a“。我改变了FooBar以将属性存储为有效的整数,但这不是我需要的。我需要实际的枚举有关如何使这个工作的任何建议,以便枚举可以作为int持久化但后来被拉出到正确的枚举类型?

3 个答案:

答案 0 :(得分:3)

您需要为枚举定义custom UserType

答案 1 :(得分:2)

一般来说,你不应该这样做。如果可以将两个(或多个枚举)分配给同一个字段,则将它们合并为一个anum。

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

@Column
private BoatType boatType;

答案 2 :(得分:0)

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

如果你真的想要这样做,你需要以某种方式编码枚举类+每次持久保存此属性时的值(使用自定义UserType作为duffymo建议)。

你能不能把它分成两个属性,每个枚举一个?然后你可以将enumValue(和enumValue2)声明为正确的类,它将开箱即用。