Проблема создания уникальной таблицы строк при сохранении списка <String> - PullRequest
1 голос
/ 02 февраля 2010

Предположим, у меня есть сущность:

@Entity
public class AnEntity implements Serializable{
   @ElementCollection
   private List<String> strings = new Vector<String>();
// other stuff
}

Я использую EclipseLink (JPA 2.0).

Строки в этом списке могут иметь одинаковые значения во многих объектах AnEntity. То есть многие объекты AnEntity могут ссылаться на одни и те же строки.

Проблема в том, что отображение по умолчанию, которое обеспечивает @ElementCollection, оставляет много дубликатов в таблице строк (ANENTITY_STRINGS). Как я могу отобразить это так, чтобы при сохранении списка строк он сохранял значения однозначно, чтобы у меня не было массивной таблицы дублирующихся строк?


Я должен добавить, что я пытался использовать классы-заполнители, в которых есть один член - строка. К сожалению, при таком способе данные в связанной таблице остаются нечитаемыми, и я уверен, что они сохраняются в виде больших двоичных объектов. Так, например, я сделал что-то подобное вместо использования List:

@ElementCollection
@ManyToMany
private List<StringWrapperClass> strings = new Vector<StringWrapperClass>();

И тогда моя сущность выглядит примерно так:

@Entity
public class StringWrapperClass implements Serializable {
    private String string;
   // other stuff, getters, setters, id, etc
}

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

Ответы [ 2 ]

1 голос
/ 02 февраля 2010

Итак, вы хотите создать отображение, где у каждого AnEntity есть много строк, и каждая строка может принадлежать множеству AnEntities. Тогда вам следует использовать @ManyToMany, потому что это отношение многих ко многим.

0 голосов
/ 02 февраля 2010

Вместо использования Vector используйте HashSet

Так что, возможно, сделайте:

private Set<String> strings = new HashSet<String>();
...