2011-09-17 7 views
5

Sono nuovo di letargo e ha iniziato a studiare il capitolo hibernate.The sto andando attraverso usi hibernate con JDBC(). La mia prima domanda è Does ibernazione uso JDBC internamente o JTA internamente per eseguire operazioni persist e get? Ma posso vedere qualche accenno a JTA anche qui, come il metodo getCurrentSeessionSession() ottiene la sessione associata alla transazione JTA corrente Domanda: - Fondamentalmente voglio capire il ruolo di JTA e jdbc qui in letargoFa Hibernate usa JDBC internamente o JTA internamente o è configurabile?"

Question2: - Posso vedere sotto lo snippet di codice in qualsiasi operazione in ibernazione

try{ 
session=factory.openSession(); 
tx=session.beginTransaction(); 
session.save(myClass); 
tx.commit(); 
} 
finally{ 
session.close(); 
} 

Qui, voglio capire il ruolo di line // tx = session.beginTransaction(); Per quanto riguarda la comprensione, ogni sessione utilizzerà una connessione. Quindi anche se iniziamo più transazioni dalla stessa sessione, useremo la stessa connessione. una volta che effettuiamo il commit della transazione specifica, tutte le transazioni create dalla stessa sessione verranno confermate una volta. Quindi, cosa stiamo cercando di ottenere con // tx = session.beginTransaction(); ?

risposta

12

Hibernate utilizza jdbc internamente o JTA internamente per eseguire operazioni persist e get?

JDBC e JTA non sono intercambiabili. JDBC is the standard API che le applicazioni Java utilizzano per interagire con un database. JTA is the standard API per la gestione delle transazioni su una o più risorse. La risposta più vicina alla tua domanda sarebbe quella "internamente", Hibernate usa JDBC per interagire con il database.

Come il metodo getCurrentSeessionSession() ottiene la sessione associata alla transazione JTA corrente.

Non esattamente. SessionFactory.getCurrentSession() ottiene una sessione in base allo current session context. Un'implementazione di tale strategia è lo JTA session context, che associa essenzialmente le sessioni a una transazione JTA. Una transazione JTA non "ha" una sessione di Hibernate, dal momento che JTA non sa nulla di Hibernate e non sarebbe del tutto corretto affermare che Hibernate utilizza internamente JTA. Semplicemente ha la capacità di integrarsi con JTA e lasciare che gestisca le transazioni.

qui voglio capire il ruolo di linea // tx = session.beginTransaction();

Inizia una transazione in qualsiasi meccanismo di transazione che si sta utilizzando, che è governato dal TransactionFactory in uso. Ad esempio, con JDBCTransactionFactory, assicura solo che auto-commit sia disattivato in modo che le modifiche non vengano confermate fino al completamento della transazione.

dopo aver eseguito la transazione specifica, tutte le transazioni create da una stessa sessione verranno confermate una volta.

In circostanze normali, una Sessione è associata a una sola transazione. Più chiamate a Session.beginTransaction() saranno semplicemente return the same underlying Transaction.

Quindi quello che stiamo cercando di realizzare con // tx = session.beginTransaction()

proprio questo: dire quello che gestisce le transazioni che si sta cominciando una nuova transazione. Ciò implica che tutto ciò che accade fino a commit() o rollback() dovrebbe avere la semantica generalmente accettata di un database transaction.

+0

Grazie Ryan Per una risposta così elanorata. Solo altri due punti. Come hai detto, "JDBC è l'API standard utilizzata dalle applicazioni Java per interagire con un database", posso dire che ogni applicazione java utilizzerà jdbc per connettersi al database in modo esplicito o interno (nel caso di strumenti orm come ibernazione) o EJB. Hai detto "JTA è l'API standard per la gestione delle transazioni su una o più risorse". Ho questo scenario in un'applicazione Java ho due schemi diversi come database. Qui userò ancora jdbc sia per il database/schema. Anch'io userò JTA qui per gestire continua ..... –

+0

continua ... le transazioni su entrambi gli schemi.Right? –

+0

@Mohit: Sarebbe un'app per Java estremamente rara che si connette a un database diverso da JDBC. Non ne ho mai sentito uno, ma * potrebbe * accadere. Per quanto riguarda JTA, è solo l'API delle transazioni JEE. Esistono altri modi per gestire le transazioni, come la gestione delle transazioni di Spring (che può tuttavia anche integrarsi con JTA). Se desideri transazioni distribuite, non ne so molto, ma penso che probabilmente vorrai implementare un'implementazione JTA. –

Problemi correlati