OneToMany JoinTable con un valore di chiave non primaria
-
27-10-2019 - |
Domanda
Sto cercando di replicare muro di Facebook in Java EE.
Ho 3 tabelle: Utente, Post, Wall.
l'uso ha un nome utente (PK) e in altri campi, Post ha un ID (PK), un autore (FK su User) e qualche altro. Wall è un Join tavolo tra Post e l'utente.
Il punto è che il progetto compila solo se ho, in parete, sia postale e utente come PK. Avendo Post dispone di PK e l'utente come un valore non nulla non funziona!
Ma avendo entrambi come PK porta ad una @ManyToMany, il che significa che lo stesso posto può essere di molti muri, che non è corretto!
Ho provato avendo appena Post come PK a Wall e l'utilizzo di questa mappatura:
Messaggio:
@JoinTable(name = "Wall", joinColumns = {
@JoinColumn(name = "id", referencedColumnName = "id")}, inverseJoinColumns = {
@JoinColumn(name = "user", referencedColumnName = "username")})
@OneToMany
private User user;
Utente:
@ManyToOne
private Collection<Post> onWall;
ma dice:
L'entità di destinazione dell'attributo rapporto [utente] sulla classe [classe entity.Post] non può essere determinato. Quando non si utilizza farmaci generici, assicurare l'entità target è definito sulla mappatura rapporto ..
Cosa c'è di sbagliato con il mio mappatura?
Soluzione
Come circa due relazioni User-to-Post, uno per la parete, uno per autore:
- utente uno-a-molti a Post (messaggi attaccati al muro di utenti, senza unirsi tabella),
- utente uno-a-molti a Post (autore del post),
con le relazioni inversa a seconda delle necessità.
Ad esempio:
@Entity
public class User {
@OneToMany(mappedBy="onWall")
private Collection<Post> wall;
// You can skip this relationship, if you don't want it
@OneToMany(mappedBy="author")
private Collection<Post> authoredPosts;
}
@Entity
public class Post {
@ManyToOne
@JoinColumn(name="wallOwnerId")
private User onWall;
@ManyToOne
@JoinColumn(name="authorId")
private User author;
}