Сопоставьте список строк с аннотациями JPA/Hibernate
Я хочу сделать что-то вроде этого:
@Entity public class Bar {
@Id @GeneratedValue long id;
List<String> Foos
}
и Foos сохраняются в таблице следующим образом:
foo_bars (
bar_id int,
foo varchar(64)
);
UPDATE:
Я знаю, как отображать другие объекты, но во многих случаях это слишком много. Похоже, то, что я предлагаю, невозможно без создания еще одного объекта или заканчивается всем в каком-то столбце blob.
Ответы
Ответ 1
Это Hibernate terms "коллекция значений" или "элементов". Для него есть (Hibernate specific) аннотация. JPA не поддерживает это (пока).
Короче, аннотируйте свою коллекцию следующим образом:
@CollectionOfElements
@JoinTable(
[email protected](name="..."),
joinColumns = @JoinColumn(name="...") // References parent
)
@Column(name="...value...", nullable=false)
Это создаст необходимую таблицу с внешними ключами и ограничениями.
Ответ 2
Вот как вы это сделаете, если используете JPA2:
@Entity public class Bar {
@Id @GeneratedValue long id;
@ElementCollection
@CollectionTable(name="foo_bars", [email protected](name="bar_id"))
@Column(name="foo")
List<String> Foos;
}
Для более ясного примера см. раздел 2.2.5.3.3 в Справочное руководство по аннотации гибернации.
Ответ 3
Если вы храните свой список в виде массива, он работает:
setFoos(String[] foos);
вы можете преобразовать его следующим образом:
setFoos(myList.toArray(new String[myList.size()]));
Ответ 4
создать объект FooBars
реорганизовать атрибут "Foos" на
@OneToMany
Список Foos
Ответ 5
Я думаю, что вам нужно:
@Entity
public class Bar {
@Id @GeneratedValue long id;
@OneToMany(mappedBy="bar") //"bar" = field name in mapping class
List<FooBar> Foos;
}
@Entity
public class FooBar {
@Id @GeneratedValue long id;
@ManyToOne
@JoinColumn(name="bar_Id")
Bar bar;
}
Ответ 6
Здесь 'Foos' - это список строк, так что он является однонаправленным.
Мы можем сделать это в одном классе модели, используя аннотацию @ElementCollection.
@Entity
@Table(name="bar")
public class Bar {
@Id @GeneratedValue
long id;
@ElementCollection
@JoinTable(
name="foo_bars",
joinColumns = @JoinColumn( name="bar_id")
)
@Column(name="foo")
List<String> Foos;
}
В БД bar_id - это внешний ключ в таблице foo_bars.