2013-06-08 24 views
5

W zależności od wielu do wielu między tabelami z tabelą odwzorowań pomiędzy, jak mogę tylko ładować identyfikatory dla drugiej jednostki.Jak załadować tylko identyfikatory z wielu do wielu tabel odwzorowań?

Poniżej znajduje się przykład wyjaśnienia, co chcę tutaj osiągnąć. Poniżej jest schemat próbką

create table user(
id int PrimaryKey, 
name text 
) 
create table pages (
id int PrimaryKey, 
page_name text 
) 
create table user_page (
id_user int, 
id_page int, 
PrimaryKey (id_user, id_page) 
) 

Uwaga: istnieją dodatkowe kolumny w tabelach użytkownika i stron, które nie zostały ujęte tutaj zwięzłości.

jednostka użytkownika:

@Entity 
@Table(name = "user") 
public class User { 
@id 
@column(name="id") 
private Integer id; 
@column(name="name") 
private String name; 
... 
... 
} 

@Entity 
@Table(name = "page") 
public class Page { 
@id 
@column(name="id") 
private Integer id; 
@column(name="page_name") 
private String name; 
... 
... 
} 

Co chcę zrobić, to dodać kolejny atrybut Set<Integer> pageIds w User klasie i mają wszystkie identyfikatory stron odwzorowane dla użytkownika w tej kolekcji.

Jak to zrobić za pomocą Hibernacji?

Odpowiedz

11

W User klasy:

@ManyToMany 
@JoinTable(
    name="user_page", 
    joinColumns = @JoinColumn(name="id_user"), 
    inverseJoinColumns = @JoinColumn(name="id_page") 
) 
public Set<Page> pages; 

można uzyskać identyfikator poprzez iteracji nad zwróconego zestawu. Domyślnie kolekcje są ładowane leniwie (tj. Tylko identyfikatory).

EDIT: Jeśli nie chcesz mapować Page z jakiegoś powodu, można użyć @ElementCollection takiego:

@ElementCollection 
@CollectionTable(name="user_page", [email protected](name="id_user")) 
@Column(name="id_page") 
public Set<Long> pageIds; 
+1

Czy jest jakiś sposób mogę załadować tylko identyfikatory w zestawie bez użycia klasy strony? tj. dodać kolejny atrybut Ustaw na klasę użytkownika, która ma wszystkie identyfikatory? –

+1

Zaktualizowałem moją odpowiedź. – lunr

1

I napotkał problem z przyjętymi odpowiedź, kiedy chciałem map zarówno pages i pageIds. Hibernacja użyje obu tych pól do wprowadzenia zmian w tabeli odwzorowań, gdy zostanie zapisany kod User, co może spowodować wiele dziwnych zachowań.

I zamiast solved this dokonując pageIds@Transient i wypełniania kolekcji za pomocą @PostLoad:

@ManyToMany 
@JoinTable(
    name="user_page", 
    joinColumns = @JoinColumn(name="id_user"), 
    inverseJoinColumns = @JoinColumn(name="id_page") 
) 
public Set<Page> pages; 

@Transient 
public Set<Long> pageIds; 

@PostLoad 
private void postLoad() { 
    pageIds = pages.stream().map(Page::getId).collect(Collectors.toSet()); 
}