2015-08-04 2 views
0

Я хочу сохранить List<String> в DB постгерра.Как сохранить строковые списки в базе данных без таблицы соединений?

@ElementCollection 
private List<String> products; 

поэтому Hibernate создаст присоединиться таблицы. Можно ли это предотвратить?

Один из способов было бы создать явный класс двунаправленного отображения следующим образом:

@Entity 
public class MainEntity { 

    @OneToMany(mappedBy = "main") 
    private List<Product> products; 
} 

@Entity 
public class Product { 
    @Id 
    private long id; 

    @ManyToOne 
    private MainEntity main; 

    private String text; 
} 

Но я чувствую, что это немного поверх всего за сохранение списка строк, не так ли?

+0

Ваш * обходной путь * - это правильный путь, продукт - это объект с большим количеством свойств, чем только * текст *, который вы, возможно, захотите сохранить в какой-то момент. Таким образом, он может быть реализован как объект. Пожалуйста, держите свой код в чистоте и не ходите с хаками, например, с раздельными запятыми + обратными вызовами adler, это скорее всего сэкономит вам некоторые головные боли миграции. Вам не нужно делать его двунаправленным. – A4L

+0

Я просто использовал * продукт * в качестве примера. По объекту realworld должен и будет содержать только простой список текстовых строк, и вы не станете устанавливать дополнительные поля! – membersound

ответ

0

я не уверен, но вы могли бы удалить:

@ManyToOne 
private MainEntity main; 

в классе продукта.

Я думаю, что это может нормально работать без этого. Вы хотите обработать свой список из MainEntity или из продукта?

+0

В приведенном выше отображении указано только ** обходное решение ** для проблемы, что «Список » инициирует создание таблицы * join *. Вопрос * не *, который не «работает». – membersound

1

Если вы не нашли ничего лучшего, попробуйте следующее:

  1. Марк ваш список с @Transient так, что он никогда не сохранялось непосредственно.
  2. Подготовить дополнительное поле для сохранения вашего списка, типа «persistable» непосредственно JPA (конкатенированная, делимированная строка кажется вполне естественной).
  3. Использовать методы, аннотированные с помощью @PostLoad и @PrePersist, для перемещения данных между этими двумя полями, преобразования из списка в строку и обратно.
Смежные вопросы