Как сохранить свойство типа List < String > в JPA?

Если вы хотите быть симпатичным, вы можете сделать:

n = sorted([minN, n, maxN])[1]
141
задан hennr 28 October 2013 в 08:23
поделиться

5 ответов

Используйте некоторую реализацию JPA 2: она добавляет аннотацию @ElementCollection, аналогичную аннотации Hibernate, которая делает именно то, что вам нужно. Вот один пример здесь .

Edit

Как упоминалось в комментариях ниже, правильная реализация JPA 2 -

javax.persistence.ElementCollection

@ElementCollection
Map<Key, Value> collection;

См .: http://docs.oracle.com/javaee /6/api/javax/persistence/ElementCollection.html[1240 visible

187
ответ дан 23 November 2019 в 22:42
поделиться

При использовании Быть в спящем режиме реализации JPA я нашел, что просто объявление типа как ArrayList вместо Списка позволяет, в спящем режиме для хранения списка данных.

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

@Entity
public class Command implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    ArrayList<String> arguments = new ArrayList<String>();


}
9
ответ дан 28 October 2013 в 08:23
поделиться

Согласно Персистентность Java с В спящем режиме

отображающиеся наборы типов значения с аннотациями [...]. Во время записи это не часть стандарта Персистентности Java

, Если Вы использовали, в спящем режиме, Вы могли бы сделать что-то как:

@org.hibernate.annotations.CollectionOfElements(
    targetElement = java.lang.String.class
)
@JoinTable(
    name = "foo",
    joinColumns = @JoinColumn(name = "foo_id")
)
@org.hibernate.annotations.IndexColumn(
    name = "POSITION", base = 1
)
@Column(name = "baz", nullable = false)
private List<String> arguments = new ArrayList<String>();

Обновление: Отметьте, это теперь доступно в JPA2.

15
ответ дан toolkit 28 October 2013 в 08:23
поделиться
  • 1
    Вместо двойного foreach Вы могли также записать свою собственную функцию декартова произведения, но это походило на излишество для этого примера. – Joel Hinz 28 September 2013 в 14:14

Этот ответ был сделан pre-JPA2 реализациями при использовании JPA2 см. ответ ElementCollection выше:

Списки объектов в объекте модели обычно считают отношениями "OneToMany" с другим объектом. Однако Строка не является (отдельно) допустимым клиентом Связи "один ко многим", поскольку она не имеет идентификатора.

Так, Вы должны преобразовывать свой список Строк к списку объектов Argument-class JPA, содержащих идентификатор и Строку. Вы могли потенциально использовать Строку в качестве идентификатора, который оставит немного свободного места в Вашей таблице и от удаления поля ID и путем консолидации строк, где Строки равны, но Вы потеряли бы способность заказать аргументы назад в их первоначальный заказ (поскольку Вы не сохранили информации для заказа).

, С другой стороны, Вы могли преобразовать свой список в @Transient и добавить другое поле (argStorage) к Вашему классу, который является любой VARCHAR () или CLOB. Необходимо будет тогда добавить 3 функции: 2 из них являются тем же и должны преобразовать Ваш список Строк в единственную Строку (в argStorage) разграниченный способом, что можно легко разделить их. Аннотируйте эти две функции (что каждый делает то же самое) с @PrePersist и @PreUpdate. Наконец, добавьте третью функцию, которая разделяет argStorage на список Строк снова, и аннотируйте его @PostLoad. Это будет держать Ваш CLOB в курсе со строками каждый раз, когда Вы идете, чтобы сохранить Команду и держать argStorage поле в курсе перед хранением его к DB.

я все еще предлагаю делать первый случай. Это - хорошая практика для реальных отношений позже.

29
ответ дан billjamesdev 28 October 2013 в 08:23
поделиться

У меня была такая же проблема, поэтому я применил предложенное возможное решение, но в конце концов решил реализовать свои ';' разделенный список String.

поэтому у меня есть

// a ; separated list of arguments
String arguments;

public List<String> getArguments() {
    return Arrays.asList(arguments.split(";"));
}

Таким образом, список легко читается / редактируется в таблице базы данных;

9
ответ дан 23 November 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: