Ho la seguente struttura di entità: Business -> Campagna -> Promozione, dove UN BUSINESS può avere MOLTE campagne e UNA campagna può avere MOLTE promozioni. Entrambe le relazioni uno-a-molti sono dichiarate come LAZY. Un posto nel mio codice, ho bisogno di prendere con entusiasmo entrambe le collezioni da un commercio, così faccio:JPA: per favore aiuta a capire "join fetch"
Query query = entityManager.createQuery("select b from Business b " +
"left join fetch b.campaigns c " +
"left join fetch c.promotions where b.id=:id");
query.setParameter("id", b.getId());
business = (Business) query.getResultList().get(0);
Tuttavia, la query restituisce un elenco di risultati che contiene 4 oggetti commerciali in esso, tutti e 4 gli oggetti si riferiscono a la stessa istanza di Business. Nel mio database, questa azienda ha 3 campagne sotto di essa, e tutte e 3 le campagne hanno 3 promozioni sotto di loro.
Ho due domande:
In un primo momento, ho usare List per contiene i molti lati di relazioni, ma quando viene eseguito il programma, io ottenere "org.hibernate.HibernateException: non può allo stesso tempo recuperare più borse " eccezione. Poi ho cercato su Google questa eccezione e sembra che debba usare Set, invece di List. Così ho cambiato la collezione in Set e ha funzionato. Qualcuno può dirmi perché Lista non funzionerà in questa situazione?
Mi aspetto che la query restituisca un singolo risultato, perché sta interrogando l'id, che è la chiave primaria e quindi dovrebbe restituire un solo risultato. Ma si scopre che restituisce 4 istanze in un elenco. È un problema? O è questo comportamento previsto?
Qualsiasi aiuto sarà molto apprezzato.
L'aggiunta di "distinto" alla query ha fatto il trucco. Grazie. –