In che modo JPA (Hibernate) gestisce le transazioni durante il recupero di oggetti dal database

StackOverflow https://stackoverflow.com/questions/245723

Domanda

Attualmente sto sviluppando un'applicazione in Java usando Hibernate come gestore di persistenza e JPA come astrazione della gestione della persistenza ibernazione.

Mi piacerebbe conoscere l'impatto del wrapping di una query sui risultati attorno a una transazione. So che il gestore dell'entità deve rimanere aperto per un bug sul campo pigramente recuperato che dire della transazione in tutto questo?

Ecco un esempio di codice con capacità di attivazione / disattivazione delle transazioni.

public List<Exportdata> get(Integer max, EntityManager em, Boolean withTransaction) {
    EntityTransaction tx = null;
    try {
        if (withTransaction) {
            tx = em.getTransaction();
            tx.begin();
        }

        Query query = em.createQuery("from Exportdata");
        query.setMaxResults(10);
        List<Exportdata> list = query.getResultList();

        if (withTransaction)
            tx.commit();

        return list;
    } catch (RuntimeException re) {
        if (withTransaction)
            if (tx != null && tx.isActive())
                tx.rollback();

        throw re;
    }
}

Qual è la differenza tra abilitare o disabilitare con Transaction quando viene chiamata questa funzione?

Grazie a tutti, Fred

È stato utile?

Soluzione

Non c'è alcuna differenza pratica qui, dal momento che non stai modificando alcun dato. La query eseguita genererà una selezione SQL. Le transazioni sono lì per consentirti di applicare le proprietà ACID a una raccolta di inserti, aggiornamenti, ecc.

Tuttavia , se si inizia a manipolare gli oggetti nell'elenco restituito da questo metodo, chiamando setter, ecc. tali modifiche verranno propagate nuovamente al database con una transazione su un hoc base. In altre parole, lavorerai efficacemente con il db in modalità auto-commit. È improbabile che questo sia quello che vuoi.

La cosa importante da capire è che la durata di un contesto di persistenza e una transazione possono essere gestite separatamente. Spesso però vorresti gestirli insieme.

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