2013-06-08 10 views
5

In una relazione Molti a Molti tra due tabelle con una tabella di mappatura intermedia, come posso caricare solo ID per la seconda entità.Come caricare solo ID da molte a molte tabelle di mapping?

Di seguito è riportato l'esempio per spiegare cosa voglio ottenere qui. Di seguito è riportato uno schema di esempio

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

Nota: ci sono colonne aggiuntive in tabelle utente e la pagina che non ho incluso qui per brevità.

entità User:

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

Quello che voglio fare è aggiungere un altro attributo Set<Integer> pageIds in User classe e di avere tutti gli ID di pagina mappati per un utente in questa collezione.

Come può essere fatto utilizzando Hibernate?

risposta

11

In User classe:

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

È possibile ottenere l'ID del scorrendo sopra il set restituito. Di default le collezioni sono pigramente (cioè solo id) caricate.

EDIT: Se non si desidera mappare Page per qualche motivo, è possibile utilizzare @ElementCollection come questo:

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

C'è un modo posso caricare solo Ids in un insieme senza utilizzare classe pagina? Ad esempio, aggiungi un altro attributo Set alla classe User che ha tutti gli id? –

+1

Aggiornato la mia risposta. – lunr

1

ho incontrato un problema con la risposta accettata, quando ho voluto mappare sia pages e pageIds. Hibernate utilizzerà entrambi questi campi per apportare modifiche alla tabella di mappatura quando viene salvato uno User, causando probabilmente un comportamento strano.

io invece solved this facendo pageIds@Transient e popolare la raccolta utilizzando @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()); 
} 
Problemi correlati