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