2012-07-21 9 views
5

Ho un m: n rapporto libro - in prestito - utente, il prestito è la tabella unirsi.M: rapporto N in JPA (confezionamento tabelle riportate)

Le tabelle sono riportati (non possono essere modificati):

  • su un lato sono utilizzati da app jdbc pure.
  • dall'altra parte vorrei usarli tramite JPA

libro (libro_id) - prendere in prestito (libro_id, used_id) - utente (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; 

Il mio problema è che, le impostazioni di cui sopra si aggiunge alcuni campi (indesiderati) in più al tavolo prestito:

'user_USER_ID' e 'book_BOOK_ID'

Come posso configurare le annotazioni jpa per conservare solo Borrow: user_id, book_id che è abbastanza il numero uno a uno?

Date un'occhiata alla foto, che dice di più:

book borrowing

risposta

7

Prima di tutto, dal momento che la tabella di prestito è un puro join tavolo, non è necessario mappare affatto. Tutto ciò che serve è un'associazione ManyToMany che utilizza questa tabella dei prestiti come JoinTable.

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

Se davvero si vuole mappare la tabella di join as un'entità, allora dovrebbe contenere due associazioni ManyToOne (uno per ogni chiave esterna). Quindi il seguente è sbagliato:

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

Infatti, mappedBy significa: questa associazione è il lato inverso della sezione OneToMany/ManyToOne bidirezionale, che è già mappata dal campo user nell'entità BorrowEntity. Si prega di vedere le annotazioni su questo campo per sapere come mappare l'associazione.

Quindi il @JoinColumn non ha senso. È in contraddizione con mappedBy. Hai solo bisogno di quanto segue:

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

Il targetEntity è anche superfluo, dal momento che è un List<BorrowEntity>: JPA può dedurre l'entità di destinazione dal tipo generico della lista.

+0

Grazie per il vostro aiuto! – cscsaba