Java 如何在hibernate中存储枚举数组

Java 如何在hibernate中存储枚举数组,java,arrays,hibernate,jpa,enums,Java,Arrays,Hibernate,Jpa,Enums,我正在尝试使用Hibernate持久化枚举数组。重要的是要注意,如果可能的话,我宁愿不使用集合。到目前为止,我在网上找到的答案是存储集合,而不是数组 我收到一个运行时错误,抱怨缺少@OrderColumn或@IndexColumn。我不希望数组按字母顺序排列。我想把它按同样的顺序退回 enum的字面意思与您所要求的一样简单,但是enum.name()不是按字母顺序排列的,因此似乎没有一个自然的“顺序”列 根据定义,我使用数组中的实际位置来指示我正在考虑的数字,枚举定义该数字的计算状态。例如,一个

我正在尝试使用Hibernate持久化枚举数组。重要的是要注意,如果可能的话,我宁愿不使用集合。到目前为止,我在网上找到的答案是存储集合,而不是数组

我收到一个运行时错误,抱怨缺少@OrderColumn或@IndexColumn。我不希望数组按字母顺序排列。我想把它按同样的顺序退回

enum的字面意思与您所要求的一样简单,但是enum.name()不是按字母顺序排列的,因此似乎没有一个自然的“顺序”列

根据定义,我使用数组中的实际位置来指示我正在考虑的数字,枚举定义该数字的计算状态。例如,一个典型的数组可能是

[0] = UNDEFINED, 
[1] = UNDEFINED, 
[2] = POSSIBLE, 
[3] = POSSIBLE, 
[4] = UNKNOWN, 
[5] = UNKNOWN, 
[6] = UNKNOWN, 
[7] = IMPOSSIBLE, 
[8] = IMPOSSIBLE,
[9] = IMPOSSIBLE.
但我遇到的挑战是,我在网上找到的所有示例和Hibernate文档似乎都只针对使用Java集合的情况;这不是我想要做的

@Entity
@Table(name = "SudokuPossibleValues")
public class SudokuPossibleValuesModel {   
    public static final int NUMBER_OF_POSSIBLE_VALUES_PLUS_ONE = 10;

    @Id
    @GeneratedValue
    private long possibleValuesID;

    @ElementCollection
    @Enumerated(EnumType.STRING)
    private SudokuPossibleValueState stateValues[] = new SudokuPossibleValueState[NUMBER_OF_POSSIBLE_VALUES_PLUS_ONE];
    ...
}

我想出了一个答案,但请告诉我在JPA或Hibernate中有更好的方法来实现这一点

@Entity
@Table(name = "POSSIBLE_VALUES")
public class PossibleValues {

   @SuppressWarnings("unused")
   private static final long serialVersionUID                   = -1L;    
   public static final int   NUMBER_OF_POSSIBLE_VALUES_PLUS_ONE = 10;

   @Id
   @GeneratedValue(generator = "possibleValuesID")
   @GenericGenerator(name = "possibleValuesID", strategy = "increment")
   @Column(name = "POSSIBLE_VALUES_ID")
   private Long possibleValuesID;

   @Transient
   private SudokuPossibleValueState[] values = new SudokuPossibleValueState[NUMBER_OF_POSSIBLE_VALUES_PLUS_ONE];
   // Ugly, disgusting hack, to deal with getting an Enumerated collection in/out of JPA/Hibernate
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState zero  = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState one   = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState two   = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState three = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState four  = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState five  = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState six   = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState seven = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState eight = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState nine  = SudokuPossibleValueState.UNDEFINED;

   // Ugly, disgusting hack, to deal with getting an Enumerated array in/out of JPA/Hibernate
   public PossibleValues() {
      values[0] = zero;
      values[1] = one;
      values[2] = two;
      values[3] = three;
      values[4] = four;
      values[5] = five;
      values[6] = six;
      values[7] = seven;
      values[8] = eight;
      values[9] = nine;
   }

   // Ugly, disgusting hack, to deal with getting an Enumerated array in/out of JPA/Hibernate
   protected void setPossibleValue(short possibleValue, SudokuPossibleValueState state) {
      switch (possibleValue) {
         case 0: values[possibleValue] = zero = state; break;
         case 1: values[possibleValue] = one = state; break;
         case 2: values[possibleValue] = two = state; break;
         case 3: values[possibleValue] = three = state; break;
         case 4: values[possibleValue] = four = state; break;
         case 5: values[possibleValue] = five = state; break;
         case 6: values[possibleValue] = six = state; break;
         case 7: values[possibleValue] = seven = state; break;
         case 8: values[possibleValue] = eight = state; break;
         case 9: values[possibleValue] = nine = state; break;
         default: throw new RuntimeException("Possible Value [" + possibleValue + "] is illegal");
      }
   }

   // Ugly, disgusting hack, to deal with getting an Enumerated array in/out of JPA/Hibernate
   @PostLoad
   protected void syncState() {
      values[0] = zero;
      values[1] = one;
      values[2] = two;
      values[3] = three;
      values[4] = four;
      values[5] = five;
      values[6] = six;
      values[7] = seven;
      values[8] = eight;
      values[9] = nine;
   }

   public Long getPossibleValuesID() {
      return possibleValuesID;
   }

   @SuppressWarnings("unused")
   private void setPossibleValuesID(Long possibleValuesID) {
      this.possibleValuesID = possibleValuesID;
   }
}

FWIW“枚举”不可嵌入。这是基本型的。谢谢。这是有帮助的;删除它至少改变了我得到的错误。最终,我让步了,并进行了下面描述的黑客攻击。您可以使用用户类型
@Entity
@Table(name = "POSSIBLE_VALUES")
public class PossibleValues {

   @SuppressWarnings("unused")
   private static final long serialVersionUID                   = -1L;    
   public static final int   NUMBER_OF_POSSIBLE_VALUES_PLUS_ONE = 10;

   @Id
   @GeneratedValue(generator = "possibleValuesID")
   @GenericGenerator(name = "possibleValuesID", strategy = "increment")
   @Column(name = "POSSIBLE_VALUES_ID")
   private Long possibleValuesID;

   @Transient
   private SudokuPossibleValueState[] values = new SudokuPossibleValueState[NUMBER_OF_POSSIBLE_VALUES_PLUS_ONE];
   // Ugly, disgusting hack, to deal with getting an Enumerated collection in/out of JPA/Hibernate
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState zero  = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState one   = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState two   = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState three = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState four  = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState five  = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState six   = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState seven = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState eight = SudokuPossibleValueState.UNDEFINED;
   @Enumerated(EnumType.STRING)
   private SudokuPossibleValueState nine  = SudokuPossibleValueState.UNDEFINED;

   // Ugly, disgusting hack, to deal with getting an Enumerated array in/out of JPA/Hibernate
   public PossibleValues() {
      values[0] = zero;
      values[1] = one;
      values[2] = two;
      values[3] = three;
      values[4] = four;
      values[5] = five;
      values[6] = six;
      values[7] = seven;
      values[8] = eight;
      values[9] = nine;
   }

   // Ugly, disgusting hack, to deal with getting an Enumerated array in/out of JPA/Hibernate
   protected void setPossibleValue(short possibleValue, SudokuPossibleValueState state) {
      switch (possibleValue) {
         case 0: values[possibleValue] = zero = state; break;
         case 1: values[possibleValue] = one = state; break;
         case 2: values[possibleValue] = two = state; break;
         case 3: values[possibleValue] = three = state; break;
         case 4: values[possibleValue] = four = state; break;
         case 5: values[possibleValue] = five = state; break;
         case 6: values[possibleValue] = six = state; break;
         case 7: values[possibleValue] = seven = state; break;
         case 8: values[possibleValue] = eight = state; break;
         case 9: values[possibleValue] = nine = state; break;
         default: throw new RuntimeException("Possible Value [" + possibleValue + "] is illegal");
      }
   }

   // Ugly, disgusting hack, to deal with getting an Enumerated array in/out of JPA/Hibernate
   @PostLoad
   protected void syncState() {
      values[0] = zero;
      values[1] = one;
      values[2] = two;
      values[3] = three;
      values[4] = four;
      values[5] = five;
      values[6] = six;
      values[7] = seven;
      values[8] = eight;
      values[9] = nine;
   }

   public Long getPossibleValuesID() {
      return possibleValuesID;
   }

   @SuppressWarnings("unused")
   private void setPossibleValuesID(Long possibleValuesID) {
      this.possibleValuesID = possibleValuesID;
   }
}