2014-04-09 18 views
5

Sto provando a progettare un'app di ospitalità. Ho due tabelle come User e Request. Gli utenti possono essere Host o Visitor e possono inviare reciprocamente una richiesta di host. ma non è necessario definire Utenti come visitatore o host, non ha importanza per il sistema, quindi non ho tabelle separate per loro. Questa differenza è importante solo nella tabella Richieste ed è necessario mantenere visitor_id e host_id come chiavi esterne (mappate con la colonna chiave user_id dalla tabella Utente perché sia ​​l'host che il visitatore sono anche utenti).Hibernate con due chiavi esterne dalla stessa tabella - annotazione

La mia domanda è come posso definire questa relazione in letargo con Annotation? Voglio dire, ci dovrebbero essere due chiavi esterne nella tabella Richieste e sono mappate su * user_id * colonna chiave primaria dalla tabella Utente. Ogni utente può essere ospite o visitatore molte volte e non fa nessuna o molte richieste.

@Entity 
public class Request { 
@Id 
private Long req_id; 

.... 

} 

risposta

8

Una richiesta è per un host, e da un visitatore, così è sufficiente avere 2 associazioni ManyToOne da richiesta di utente:

@Entity 
public class Request { 
    @Id 
    @Column(name = "req_id") 
    private Long id; 

    @ManyToOne 
    @JoinColumn(name = "visitor_id") 
    private User visitor; 

    @ManyToOne 
    @JoinColumn(name = "host_id") 
    private User host; 

    // ... 
} 

Se si vuole fare queste associazioni bidirezionale, allora è sufficiente bisogno di collezioni corrispondenti nell'utente:

@Entity 
private class User { 

    /** 
    * requests made to this user, in order for this user to be a host 
    */ 
    @OneToMany(mappedBy = "host") 
    private Set<Request> hostRequests = new HashSet<>(); 

    /** 
    * requests made by this user, in order for this user to be a visitor 
    */ 
    @OneToMany(mappedBy = "visitor") 
    private Set<Request> visitorRequests = new HashSet<>(); 

    // ... 
} 
+0

Ciao, ho tavolo tipo simile con ibernazione. Funziona bene, sto affrontando un problema con i riferimenti avanti e indietro di Jackson. Come solo una colonna può essere referenziata in Jackson, se faccio altri 500 errori –

Problemi correlati