2015-01-09 10 views
10

Ho 2 tabelle: Order [OrderId(PK), OrderShipmentCode, ...] e Shipment[ShipmentId(PK), ShipmentCode, ...].Hibernate: @ManyToOne (fetch = FetchType.LAZY) non funziona sulla colonna di riferimento non chiave primaria

In Order classe, ho dichiarato shipment campo come segue:

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "OrderShipmentCode", referencedColumnName = "ShipmentCode", insertable = false, updatable = false, nullable = false) 
private Shipment shipment; 

Quando ho l'elenco dei Order, il Shipment è anche caricato (ho visto molte query SELECT separati). Ma voglio che lo Shipment sia pigro, non da caricare insieme a Order.

Per altre tabelle, se la colonna di riferimento è la chiave primaria, i risultati sono come previsto (viene utilizzato il caricamento lento). Nel mio caso, ShipmentCode non è la chiave primaria della tabella Shipment e il caricamento lento non viene utilizzato da Ibernazione.

Puoi mostrarmi come raggiungere questo obiettivo?

EDIT: Il codice Query è come muggito: query

Criteria criteria = HibernateUtil.getSessionFactory().getCurrentSession().createCriteria(Order.class); 
List result = criteria.list(); 

SQL sono: 1 SELECT per Order tavolo e un mazzo di un'istruzione SELECT per Shipment

+0

si può mostrare il codice per criteri o query di essere licenziato? – RAS

risposta

0

È necessario specificare optional = false :

@OneToOne(optional = false, fetch = FetchType.LAZY) 

o semplicemente t urna in una @ManyToOne:

@ManyToOne(fetch = FetchType.LAZY) 
+3

Grazie. Ho già provato la tua soluzione ma il risultato è lo stesso –

+0

Controlla la mia risposta aggiornata –

+2

Ho anche provato con la tua risposta aggiornata ma i risultati sono sempre gli stessi. –

0

Prova questa:

Criteria criteria = HibernateUtil.getSessionFactory() 
           .getCurrentSession() 
           .createCriteria(Order.class) 
           .setFetchMode("shipment", FetchMode.LAZY); 
+1

Aggiungi spiegazione alla tua soluzione – user7294900

Problemi correlati