2013-06-08 12 views
5

In einer Viele-zu-Viele-Beziehung zwischen zwei Tabellen mit einer Mapping-Tabelle dazwischen, wie kann ich nur IDs für die zweite Entität laden.Wie lade ich nur IDs von vielen zu vielen Mappingtabellen?

Das folgende Beispiel soll erklären, was ich hier erreichen möchte. Unten finden Sie eine Beispielschema

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) 
) 

Hinweis: Es gibt zusätzliche Spalten in Benutzer- und Seitentabellen, die ich hier nicht der Kürze halber aufgenommen haben.

Benutzer Einheit:

@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; 
... 
... 
} 

Was ich will, ist ein weiteres Attribut tun hinzufügen Set<Integer> pageIds in User Klasse und haben alle Seiten-IDs für einen Benutzer in dieser Sammlung abgebildet.

Wie kann dies mit Hibernate geschehen?

Antwort

11

In User Klasse:

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

Sie können die IDs erhalten, indem über die zurück Satz laufen. Standardmäßig werden Sammlungen nur langsam geladen (d. H. Nur IDs).

EDIT: Wenn Sie Page aus irgendeinem Grunde nicht zuordnen möchten, können Sie @ElementCollection wie diese verwenden:

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

Gibt es eine Möglichkeit, nur Ids in einem Set laden können, ohne Page-Klasse zu verwenden? d. h. ein weiteres Attribut Set zur Benutzerklasse hinzufügen, die alle IDs hat? –

+1

Meine Antwort wurde aktualisiert. – lunr

1

ich ein Problem mit der akzeptierten Antwort gestoßen, als ich wollte beide zur Karte pages und pageIds. Hibernate wird diese beiden Felder verwenden, um Änderungen an der Mapping-Tabelle vorzunehmen, wenn eine User gespeichert wird, was möglicherweise zu merkwürdigem Verhalten führt.

ich stattdessen solved this von pageIds machen @Transient und bevölkern die Sammlung @PostLoad mit:

@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()); 
} 
Verwandte Themen