Сопоставление коллекции типов Enum, реализующих интерфейс

У меня есть сложная вещь, которую я пытаюсь сопоставить с 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, поскольку он таков, что его можно встроить? Или я использую класс пользовательского типа, который я написал, в качестве целевого класса коллекции? Я немного смущен тем, как это работает для чего-то подобного. Я хочу, чтобы он был достаточно общим, чтобы сохранять A или B, возможно, в коллекции (хотя в конечном итоге он будет только одним типом для каждого объекта, но может быть и тем, и другим).

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


person kjordan    schedule 28.04.2011    source источник
comment
JPA не поддерживает поля интерфейса или коллекцию‹Интерфейс›.   -  person DataNucleus    schedule 29.04.2011


Ответы (1)


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

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

person Augusto    schedule 28.04.2011
comment
Я написал один, который делает именно это, но я пытаюсь сделать еще один шаг и создать коллекцию, объявленную либо с интерфейсом, который они расширяют, либо даже просто с Enum‹?›. Проблема, с которой я сталкиваюсь, заключается в том, чтобы выяснить, как заставить коллекцию использовать мой пользовательский тип для хранения перечислений. Я не уверен, стоит ли добавлять @Type для использования моего пользовательского типа или мне нужно что-то сделать с targetClass из @ElementCollection. - person kjordan; 29.04.2011