Сопоставьте список строк с аннотациями JPA / Hibernate - PullRequest
21 голосов
/ 28 апреля 2009

Я хочу сделать что-то вроде этого:

    @Entity public class Bar {
        @Id @GeneratedValue long id;
        List<String> Foos
    }

и сохранить Foos в таблице, подобной этой:

foo_bars (
    bar_id int, 
    foo varchar(64)
);

UPDATE:

Я знаю, как отображать другие объекты, но во многих случаях это излишне. Похоже, то, что я предлагаю, невозможно без создания еще одной сущности или в конечном итоге со всем в некотором столбце BLOB.

Ответы [ 6 ]

28 голосов
/ 02 января 2012

Вот как бы вы это сделали, если используете JPA2:

@Entity public class Bar {
   @Id @GeneratedValue long id;

   @ElementCollection
   @CollectionTable(name="foo_bars", joinColumns=@JoinColumn(name="bar_id"))
   @Column(name="foo")
   List<String> Foos;
 }

Более ясный пример см. В разделе 2.2.5.3.3 в Справочном руководстве по аннотациям в спящем режиме .

27 голосов
/ 06 июня 2009

Это в терминах гибернации"коллекция значений" или "элементы" Для этого есть (Hibernate-специфическая) аннотация. JPA не поддерживает это (пока).

Короче, комментируйте свою коллекцию так:

@CollectionOfElements
@JoinTable(
        table=@Table(name="..."),
        joinColumns = @JoinColumn(name="...") // References parent
)
@Column(name="...value...", nullable=false)

Это создаст необходимую таблицу с внешними ключами и ограничениями.

4 голосов
/ 16 ноября 2009

Если вы храните свой список в виде массива, он работает:

setFoos(String[] foos);

Вы можете преобразовать это так:

setFoos(myList.toArray(new String[myList.size()]));
0 голосов
/ 24 февраля 2019
Here 'Foos' is List of String, So it is unidirectional. We can do this in one model class using @ElementCollection annotation.

@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

0 голосов
/ 28 апреля 2009

Я думаю, это то, что вам нужно:

@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;
}
0 голосов
/ 28 апреля 2009

создать сущность 'FooBars'

рефакторинг атрибута 'Foos' к

@ OneToMany Список Foos

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...