Mapping Collection типов Enum, которые реализуют интерфейс - PullRequest
5 голосов
/ 29 апреля 2011

У меня есть хитрая вещь, которую я пытаюсь сопоставить с Enums для хранения статических данных.

Он начинается с перечисления классов, объявленных так:

interface MyInterface {
    String getName();
}

public enum A implements MyInterface {
FIRST_A("First A");
private final String name;
private A(String name) {
this.name = name;
}
public String getName() {
return name;
}

public String toString() {
return name;
}
}

public enum B implements MyInterface {
FIRST_B("First B");
private final String name;
private B(String name) {
this.name = name;
}
public String getName() {
return name;
}

public String toString() {
return name;
}
}

Теперь я хочу использовать их как:

List<MyInterface> elements

Проблема заключается в отображении коллекции. Я могу сохранить это нормально, если я использую CompositeUserType, который я написал для записи класса сохраняемого перечисления, а также значение String, которое будет получено при сохранении @Enumerated с EnumType.STRING. В этих случаях я могу заявить:


@Type(type="MyCustomEnumType.class")
@Columns(columns = {
            @Column(name = "enumValue"), @Column(name = "enumClass")
})
private Enum enumValue;

В этом случае я могу сохранить их очень хорошо, но я не уверен, что использование @Type в коллекции заставит все элементы в этой коллекции сохраняться с использованием этого пользовательского типа. Должен ли я использовать @ElementCollection, так как он таков, что он встраиваемый? Или я использую класс пользовательского типа, который я написал, как targetClass коллекции? Я немного запутался в том, как это работает для чего-то подобного. Я хочу сохранить его достаточно универсальным, чтобы сохранить A или B, возможно, в коллекции (хотя в конечном итоге это будет только один тип для сохраняемой сущности, но может быть и другим).

Я бы предпочел не устанавливать его как класс Entity, поскольку он представляет собой статические данные, которые не изменятся, но могут иметь новую версию в будущем, которая в итоге станет другим перечислением.

1 Ответ

1 голос
/ 29 апреля 2011

Hibernate не поддерживает это «из коробки», но вы можете написать свой собственный usertype для хранения полного имени Enum, например com.package.Type.ENUM_VALUE.Я не знаю, могут ли пользовательские типы использоваться для сопоставления одного значения / объекта более чем одному столбцу базы данных.

Существует пример здесь типа пользователя для хранения перечисления.В примере просто хранится перечисление, но вы можете использовать его в качестве шаблона.

...