2012-07-21 10 views
5

Ich habe eine m: n Beziehung Buch - leihen - Benutzer, das Borrow ist die Join-Tabelle.M: N-Beziehung in JPA (Umhüllung gegeben Tabellen)

Die Tabellen sind angegeben (kann nicht geändert werden):

  • auf der einen Seite sie auch von jdbc App verwendet werden.
  • auf der anderen Seite Ich mag würde sie über JPA

Buch (book_id) verwenden - leihen (book_id, used_id) - Benutzer (user_id)

used jpa annotations: 
User: 
@OneToMany(targetEntity=BorrowEntity.class, mappedBy="user") 
@JoinColumn(name="USER_ID", referencedColumnName="USER_ID")  
private List<BorrowEntity>borrowings; 

Book: 
@OneToMany(targetEntity=BorrowEntity.class, mappedBy="book") 
@JoinColumn(name="BOOK_ID", referencedColumnName="BOOK_ID") 
private List<BorrowEntity>borrowings; 

Mein Problem ist, dass durch die Einstellungen darüber fügt einige zusätzliche (unerwünschte) Felder zum borrow Tabelle:

'user_USER_ID' und 'book_BOOK_ID'

Wie kann ich die JPA-Annotationen so konfigurieren, dass sie nur noch borgen: user_id, book_id, was reicht den vielen zu eins?

einen Blick auf das Bild aufnehmen, das mehr sagt:

book borrowing

Antwort

7

Vor allem, da die borrow Tisch eine reine Join-Tabelle ist, brauchen Sie nicht, es überhaupt zu kartieren. Sie benötigen lediglich eine ManyToMany-Verknüpfung, die diese Ausleih-Tabelle als JoinTable verwendet.

@ManyToMany 
@JoinTable(name = "borrow", 
      joinColumns = @JoinColumn(name = "USER_ID"), 
      inverseJoinColumns = @JoinColumn(name = "BOOK_ID")) 
private List<Book> borrowedBooks; 
... 

@ManyToMany(mappedBy = "borrowedBooks") 
private List<User> borrowingUsers; 

Wenn Sie wirklich zuordnen möchten die Tabelle als Einheit beitreten, dann sollte es zwei ManyToOne Verbände enthalten (eine für jeden Fremdschlüssel). Also folgende ist falsch:

@OneToMany(targetEntity=BorrowEntity.class, mappedBy="user") 
@JoinColumn(name="USER_ID", referencedColumnName="USER_ID")  
private List<BorrowEntity>borrowings; 

Tat mappedBy bedeutet: Dieser Verband ist die Kehrseite des bidirektionalen OneToMany/ManyToOne Vereins, der bereits durch das Feld abgebildet wird user in der BorrowEntity Einheit. In den Anmerkungen zu diesem Feld finden Sie Informationen zum Zuordnen der Zuordnung.

So macht die @JoinColumn keinen Sinn. Es steht im Widerspruch zu mappedBy. Sie müssen nur die folgenden:

@OneToMany(mappedBy="user") 
private List<BorrowEntity>borrowings; 

Die targetEntity auch überflüssig ist, da es eine ist List<BorrowEntity>: JPA die Zielperson aus dem generischen Typ der Liste entnehmen kann.

+0

Danke für Ihre Hilfe! – cscsaba