Hibernate und JDBC in einer Transaktion
Habe ich eine Methode, markiert als @Transactional.
Es besteht aus mehrere Funktionen, die einer von Ihnen verwendet JDBC und die zweite Hibernate, Dritte - JDBC.
Das problem ist, dass änderungen, vorgenommen durch die Hibernate Funktion nicht sichtbar sind, in den letzten Funktionen, das funktioniert mit JDBC.
@Transactional
void update() {
jdbcUpdate1();
hibernateupdate1();
jdbcUpdate2(); //results of hibernateupdate1() are not visible here
}
Alle Funktionen, die konfiguriert sind, verwenden Sie die gleiche datasource:
<bean id="myDataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
<property name="targetDataSource" ref="targetDataSource"/>
</bean>
<bean id="targetDataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" lazy-init="true" scope="singleton">
<!-- settings here -->
</bean>
myDataSource bean im code verwendet wird. myDataSource.getConnection() wird verwendet, um die Arbeit mit verbindungen im jdbc-Funktionen und
getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
...
}
});
verwendet wird in der hibernate-Funktion.
Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersten, vermeiden Sie die Verwendung von JDBC bei der Verwendung von hibernate.
Dann, wenn Sie Sie wirklich brauchen, verwenden, um
Session.doWork(..)
. Wenn Sie Ihre hibernate-version noch nicht mit dieser Methode, erhalten dieConnection
aussession.connection()
.Können Sie JDBC und Hibernate, die in der gleichen Transaktion, wenn Sie die richtige Feder-setup:
Dies setzt Voraus, dass der JDBC-Teil des DAO verwendet JdbcTemplate. Wenn es nicht Sie haben ein paar Optionen:
Letzteres ist bevorzugt, da es hidse die DataSourceUtils.getConnection innerhalb der proxy-datasource.
Dies ist natürlich der XML-Pfad, es sollte leicht zu konvertieren, das auf Anmerkungen beruht.
Das problem ist, die Operationen auf Hibernate Motor nicht in unmittelbarer SQL-Ausführung. Sie können lösen Sie es manuell aufrufen
flush
auf die Hibernate-session. Dann die änderungen im Ruhezustand sichtbar sein wird, um den SQL-code innerhalb der gleichen Transaktion. Solange du nichtDataSourceUtils.getConnection
SQL-Verbindung zu erhalten, denn nur dann haben Sie Sie ausführen in der gleichen Transaktion...In die entgegengesetzte Richtung, das ist schwierig, denn Sie haben 1nd-level-cache (session-cache) und evtl. auch 2nd-level-cache. Mit 2nd-level-cache alle änderungen der Datenbank werden Sie unsichtbar für den Ruhezustand, wenn die Zeile im Cache zwischengespeichert wird, bis der cache abläuft.