2014-04-09 2 views
5

Próbuję zaprojektować aplikację gościnności. Mam dwie tabele jako User i Request. Użytkownicy mogą być Host lub Visitor i mogą wysyłać do siebie żądania hosta. ale nie ma potrzeby definiowania Użytkowników jako gości lub hostów, nie ma to znaczenia dla systemu, więc nie mam osobnych tabel dla nich. Ta różnica jest ważna tylko w tabeli żądania i jest potrzebna do zachowania visitor_id i host_id jako kluczy obcych (mapowanych z kolumną klucza podstawowego user_id z tabeli użytkownika, ponieważ zarówno host, jak i odwiedzający są również użytkownikami).Hibernacja z dwoma kluczami obcymi z tej samej tabeli - adnotacja

Moje pytanie brzmi: jak zdefiniować tę relację w stanie hibernacji za pomocą Annotation? Mam na myśli, że w tabeli Request powinny znajdować się dwa klucze obce i są odwzorowane na kolumnę klucza głównego * user_id * z tabeli User. Każdy użytkownik może być gospodarzem lub odwiedzającym wiele razy i nie składa żadnych lub wielu próśb.

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

.... 

} 

Odpowiedz

8

Żądanie jest dla gospodarza, a od gościa, więc trzeba po prostu mieć 2 skojarzenia ManyToOne z prośbą o Użytkowniku:

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

    // ... 
} 

Jeśli chcesz, aby związki te dwukierunkowe, to po prostu Potrzebuję odpowiednich kolekcji w użytkowniku:

@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

Witam, mam podobny rodzaj tabeli ze stanem hibernacji. Działa to dobrze, mam problem z odniesieniami do przodu i do tyłu Jacksona. Jak Tylko jedna kolumna zawiera odniesienia w Jackson, jeśli zrobię inne 500 errosów –