2009-04-28 19 views
21

chcę zrobić coś takiego:mapie listę ciągów z JPA/Hibernate Adnotacje

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

i mieć Foos utrzymują się w tabeli jak poniżej:

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

UPDATE:

Wiem, jak odwzorować inne obiekty, ale w wielu przypadkach jest to przesada. Wygląda na to, że sugeruję, że nie jest to możliwe bez stworzenia kolejnego elementu lub zakończenia wszystkiego w kolumnie "blob".

Odpowiedz

27

To jest w Hibernate terms "zbiór wartości" lub "elementy". Jest tam adnotacja (specyficzna dla Hibernacji). WZP nie obsługuje tego (jeszcze).

W skrócie, opisywanie swoją kolekcję tak:

@CollectionOfElements 
@JoinTable(
     [email protected](name="..."), 
     joinColumns = @JoinColumn(name="...") // References parent 
) 
@Column(name="...value...", nullable=false) 

Spowoduje to utworzenie niezbędnej tabeli z kluczami i ograniczeń zagranicznych.

+28

Od wersji JPA 2 można to zrobić przenośnie za pomocą adnotacji ElementCollection, która jest w zasadzie ustandaryzowaną wersją CollectionOfElements, i pozwala tworzyć kolekcje plików Embeddables lub podstawowe, zawierające ciągi: http: //en.wikibooks. org/wiki/Java_Persistence/ElementCollection –

0

utworzyć podmiot

Refactor 'FooBars' z Attribut 'Foos' do

@OneToMany wyświetlić Listę Foos

+1

Dzięki, Michael, ale miałem nadzieję, że uniknę tu innej istoty. Tak naprawdę potrzebuję tylko struny w każdym przypadku ... Miałem nadzieję, że uda mi się uzyskać hibernację, aby zająć się wszystkim dla mnie. – danb

0

ja myślę, że to jest to, czego potrzebujesz:

@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; 
} 
+3

dziękuję Vangerowi, ale miałem nadzieję, że uniknę tu innej istoty. Tak naprawdę potrzebuję tylko struny w każdym przypadku ... Miałem nadzieję, że dostanę hibernację, aby zająć się wszystkim dla mnie. – danb

3

Jeśli przechowujesz listę jako tablica, to działa:

setFoos(String[] foos); 

można przekształcić go tak:

setFoos(myList.toArray(new String[myList.size()])); 
27

Oto jak można to zrobić, jeśli używasz 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; 
} 

jaśniejszego przykład patrz 2.2.5.3.3 w the Hibernate Annotations Reference Guide.

Powiązane problemy