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?

È stato utile?

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top