Domanda

Ho un metodo che restituisce molti dati, dovrei usare @TransactionAttribute (TransactionAttributeType.NOT_SUPPORTED) per questo metodo. Il metodo esegue una query JPA e carica l'intero contenuto di una tabella (circa 1000 righe).

È stato utile?

Soluzione

Il client per questo metodo - è già in una transazione? Quando si utilizza NotSupported, la transazione del chiamante verrà sospesa. Altrimenti direi, basta inserire Mai come tipo di transazione. Non è mai meglio poiché i chiamanti sanno che non devono chiamare questo metodo dall'interno di una transazione. Un contratto più diretto.

Usiamo sempre Never per metodi che eseguono più elaborazioni in modo che gli sviluppatori siano consapevoli di non chiamare se sono già coinvolti in una transazione. Spero che sia d'aiuto.

Altri suggerimenti

Mi dispiacerebbe non essere d'accordo in quanto raramente accade che l'utente non sia in una transazione in quasi tutti i sistemi. L'approccio migliore è utilizzare NON SUPPORTATO in modo che la transazione venga sospesa se il chiamante è già in una transazione. MAI è fastidioso a meno che tu non abbia una serie di chiamate che non rientrano tutte nell'ambito di NO TRANSAZIONE. In breve, NON SUPPORTATO è il tipo che si dovrebbe usare.

Per quanto ne so (almeno questo è il caso di Hibernate), non è possibile utilizzare JPA al di fuori di una transazione poiché il ciclo di vita del gestore entità è collegato al ciclo di vita della transazione. Pertanto, il metodo effettivo che esegue la query deve essere transazionale.

Tuttavia, puoi impostarlo su TransactionAttributeType.REQUIRES_NEW ; questo sospenderebbe qualsiasi transazione esistente, ne avvierebbe una nuova e la fermerebbe quando il metodo ritorna. Ciò significa che tutte le tue entità sarebbero distaccate dal momento in cui raggiungono il chiamante, ed è quello che sembra che tu stia cercando di ottenere.

Nei sistemi più complessi, è utile separare completamente il livello dati dal livello aziendale e creare un nuovo set di oggetti. Il metodo chiamerà quindi la query JPA, quindi utilizzerà le entità restituite per popolare gli oggetti dal livello aziendale e li restituirà. In questo modo il chiamante non potrà mai mettere le mani sulle effettive entità JPA e tu sei libero di fare nel tuo livello dati quello che vuoi, dal momento che ora è solo un dettaglio di implementazione. (Cavolo, potresti cambiare la chiamata del database in una chiamata API remota e il tuo chiamante non dovrebbe saperlo.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top