2009-03-22 8 views
7

Ho un modello di libro e un modello di inventario mappati per numero ISBN, ma l'ISBN non è la chiave primaria in entrambi. I libri appartengono a Bookstores e Inventory è per un gruppo di librerie (BookstoreChain). L'inventario è condiviso da tutte le librerie appartenenti a un bookstoreChain.ORM: mapping OneToOne nella colonna Join non chiave primaria - Libro e inventario mappati per ISBN

Sto utilizzando il mapping Hibernate @OneToOne sul lato del libro per recuperare informazioni sull'inventario unendomi alla colonna ISBN. In qualche modo, Hibernate genera correttamente la query di outer join di sinistra, ma l'inventario è nullo sull'oggetto Book. Non è nemmeno pigro. Ignorando Libreria e Catena, come faccio a unire OneToOne o ManyToOne e recuperare l'inventario quando vengono recuperati libri?

risposta

0

solo un'ipotesi: does name = 'ISBN' deve essere lo stesso del campo in Inventario?

+0

Questo non è un problema. Il codice mostrato è solo indicativo. Il vero problema sta da qualche parte nel OneToOne – Sathish

+0

ok - mi hai preso. Non sto ancora usando annotazioni sul mio progetto di ibernazione. Si può semplicemente verificare che i dati abbiano effettivamente la relazione. – Martlark

1

dubito che questo ha qualcosa a che fare con il problema, ma ho pensato di portarlo fino in ogni modo solo per garantire che non è un Gotcha che è stato trascurato:

Si noti che quando si utilizza referencedColumnName a una colonna chiave non primaria , la classe associata ha in modo serializzabile.

Riferimento: [http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html][1]

So che ha detto che il join esterno sinistro viene generata, ma ho pensato che il default recuperare era pigro, se non è stato specificato. Forse, specificando esplicitamente la modalità di recupero potrebbe dare risultati diversi.

Infine, se si sta utilizzando una query HQL, forse la pubblicazione di questa con altre classi di entità aiuterà la comunità a risolvere il problema.

+0

L'inventario è serializzabile. OneToOne è impaziente di default. Sto solo utilizzando una query sui criteri per selezionare Prenota per ISBN e controlla se ottengo i dettagli dell'inventario – Sathish

1

Lo schema del database non ha senso, in base a ciò che hai mostrato qui. Il rapporto tra libro e inventario dovrebbe essere uno a molti - presumibilmente, lo stesso libro è in diversi inventari, il che significa che non è possibile associare libri e inventari solo con l'isbn. Poiché l'isbn non è univoco tra gli inventari, avrai più righe nell'inventario con lo stesso isbn ma diversi chainId - quale riga è la riga giusta per un determinato libro/isbn? Il libro dovrebbe avere una chiave esterna per inventory.id, non inventory.isbn.

3

Devi nominare il tuo riferimento di join qualcos'altro. isbn è già una colonna. Prova questo:

@OneToOne(optional = true) 
@JoinColumn(name = "inventory", referencedColumnName = "isbn",insertable = false, updatable = false) 
Inventory inventory; 
Problemi correlati