penso che si sta facendo qualcosa di sbagliato nella tua classe DAO perché si sono aperti una sessione e una transazione all'interno del vostro metodo e, probabilmente, in ognuno di metodi del DAO.
Se ciò comporta un costo in termini di prestazioni ed è poco concettuale, una transazione deve raggruppare un insieme di operazioni che avranno esito positivo o negativo. Nella maggior parte dei casi una transazione di database sarà correlata a un'intera operazione aziendale, in questo caso una richiesta REST. Qualcosa di simile
POST/utente
@ RestController.createUser
transazione aperta
UserDAO.saveUser
commit della transazione
risposta
Inoltre, se si guarda il codice si sta aprendo una transazione e poi si chiude.
tx = session.getTransaction();
session.beginTransaction();
tx.commit();
In questo caso si sta interrogando il database in modo che non sia necessaria alcuna transazione.
Le transazioni sono una preoccupazione trasversale nella vostra applicazione e, dato che state già utilizzando Spring, dovreste esaminare l'annotazione @Transactional (o il suo equivalente xml) per ottenere una transazione con AOP (Spring crea un aspetto aroud). Ciò renderebbe il tuo codice molto più leggibile e mantenibile.
La risposta di @ManojP ha una buona e una cattiva cosa. Penso che dovresti evitare le relazioni bidirezionali ogni volta che puoi perché rende più difficile il design. Il mio consiglio è questo: iniziare sempre con relazioni unidirezionali e se hai trovato un caso in cui non puoi evitarlo, usalo.La cosa buona è che sta mostrando a voi l'uso di pigrizia quando lo fa:
List<User> users = profession.getUsers();
Questa riga di codice dovrebbe essere al di fuori del DAO. Quello che succede è che hai un elenco di utenti contrassegnati come pigri (è l'impostazione predefinita), quindi quando recuperi le professioni con la query dei criteri, viene attivata una selezione sulle professioni della tabella e ognuno degli oggetti Professione viene creato con un raccolta proxy invece della raccolta vera. Quando chiami profession.getUsers() una nuova selezione viene innescata sulla tabella degli utenti dove professione_id = professione.getId(). Quindi:
- Elenco risultati = criteria.list();
- Seleziona * dalla professione
- professionA.getUsers();
- Select * from utente in cui profession_id =: professionA.getId()
Ma attenzione! se si dispone di una collezione di professioni (come penso che si deve perché si sta tornando una lista) e iterazioni su ogni professione e chiedere l'elenco degli utenti faresti:
- risultati list = criteria.list();
- Select * from Professione
- per ogni professione -> profession.getUsers
- select * from utente in cui profession_id =: professionA.getId()
- Select * from utente in cui profession_id =: professionB.getId()
Questo avrà una prestazione negativa.
La risposta di @farvilain è buona. Ma in questo caso recupererai sempre una Professione con la sua collezione di Utenti perché all'interno del tuo DAO usi sempre FetchMode.JOIN, e quindi stai perdendo il beneficio della pigrizia. Quindi, se vuoi sempre la lista degli utenti quando stai interrogando Professions, usa lazy = true per la raccolta di utenti, ma sii consapevole dei costi che possono avere (se l'utente ha una raccolta non pigro A quando si interroga Professions recupererai anche l'elenco degli utenti più la raccolta A). Se non si desidera che questo, forse si potrebbe avere questa firma:
public List<Profession> getProfessionById(Long id, FetchMode fetchMode) throws Exception
Questo non è molto bello, ma mostra che il client DAO potrebbe scegliere la modalità fecth.
Criteri cr = session.createCriteria (User.class); cr.add (Restrictions.eq ("pid", pid)); Elenco risultati = cr.list(); Potresti anche aggiornare la domanda con la mappatura e la relazione ER tra Professione e Utente? Credo che con la sua mappatura ManyToMany, in questo caso, puoi utilizzare EAGER FETCH nel tuo stesso codice e otterrai direttamente gli utenti associati all'oggetto Profession. – pratikpawar
Puoi spiegare in questo caso qual è la richiesta di REST? – gabrielgiussi
Risponderai al controllo. – ozgur