java.sql.Connection
Hibernateセッションの関連付けを取得できる必要があります。この接続は実行中のトランザクションに関連付けられている可能性があるため、他の接続は機能しません。
session.connection()が非推奨になった場合、どうすればよいですか?
java.sql.Connection
Hibernateセッションの関連付けを取得できる必要があります。この接続は実行中のトランザクションに関連付けられている可能性があるため、他の接続は機能しません。
session.connection()が非推奨になった場合、どうすればよいですか?
回答:
ここで、WorkAPIを使用する必要があります。
session.doWork(
new Work() {
public void execute(Connection connection) throws SQLException
{
doSomething(connection);
}
}
);
または、Java 8以降では:
session.doWork(connection -> doSomething(connection));
SessionImpl sessionImpl = (SessionImpl) session; Connection conn = sessionImpl.connection();
その後、接続オブジェクトは、小さなメソッドに限定されるだけでなく、そのコード内で必要な他の場所で使用できます。
session.doWork(this::doSomething)
。結果を返したい場合-doReturningWork()を使用
session.connect()
が非推奨になった場合、どうすればよいですか?
Javadocに記載されているように、APIを使用する必要がSession#doWork(Work)
ありWork
ます。
connection()
非推奨。(4.xでの削除が予定されています)。交換は必要に応じて異なります。直接JDBCのものを使用するためdoWork(org.hibernate.jdbc.Work)
; 「一時セッション」の使用(未定)を開くため。
Hibernate 4.xの前にしばらく時間がありますが、非推奨のAPIを使用するとどういうわけか次のようになります。
:)
更新:REによると:[hibernate-dev] hibernate-devリストの接続プロキシ、非推奨の当初の意図は、Session#connection()
「悪い」APIであると見なされたため、の使用を思いとどまらせることだったようですが、その時にとどまることになっていた。彼らは気が変わったと思います...
Session#connection()
Hibernate Core 3.3のjavadocに代替案が記載されています)、これは通常、読者が推測できないものです。
hibernate
)を使用してhibernate-core
いて、最新バージョンがないためです。また、Ultimateバージョン(3.5.x)の場合、JBossNexusリポジトリで利用できます。
これを試して
((SessionImpl)getSession()).connection()
実際、getSessionはセッションインターフェイスタイプを返します。セッションの元のクラスが何であるかを確認し、元のクラスに型キャストしてから接続を取得する必要があります。
幸運を!
SessionImpl
はHibernateの内部パッケージに含まれているため(使用することを意図していません)、実際の実装に依存しています。また、キャストするときに、テストでセッションを簡単にモックすることはできません。
まだ多くのキャストが関係している別のオプションがありますが、少なくともリフレクションは必要ありません。これにより、コンパイル時のチェックが返されます。
public Connection getConnection(final EntityManager em) {
HibernateEntityManager hem = (HibernateEntityManager) em;
SessionImplementor sim = (SessionImplementor) hem.getSession();
return sim.connection();
}
もちろん、いくつinstanceof
かのチェックでそれを「よりきれい」にすることもできますが、上記のバージョンは私にとってはうまくいきます。
これをHibernate4.3で行う方法は次のとおりであり、非推奨ではありません。
Session session = entityManager.unwrap(Session.class);
SessionImplementor sessionImplementor = (SessionImplementor) session;
Connection conn = sessionImplementor.getJdbcConnectionAccess().obtainConnection();
session
しても安全SessionImplementor
ですか?
これは私が使用し、私のために働くものです。SessionオブジェクトをSessionImplにダウンキャストし、接続オブジェクトを簡単に取得します。
SessionImpl sessionImpl = (SessionImpl) session;
Connection conn = sessionImpl.connection();
ここで、session
はHibernateセッションオブジェクトの名前です。
connection()
インターフェイスで非推奨になりました。で引き続き利用できますSessionImpl
。Springが行うことを実行して、それを呼び出すことができます。
これがHibernateJpaDialect
Spring3.1.1のコードです
public Connection getConnection() {
try {
if (connectionMethod == null) {
// reflective lookup to bridge between Hibernate 3.x and 4.x
connectionMethod = this.session.getClass().getMethod("connection");
}
return (Connection) ReflectionUtils.invokeMethod(connectionMethod, this.session);
}
catch (NoSuchMethodException ex) {
throw new IllegalStateException("Cannot find connection() method on Hibernate session", ex);
}
}
この記事を見つけました
package com.varasofttech.client;
import java.sql.Connection;
import java.sql.SQLException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.internal.SessionImpl;
import org.hibernate.jdbc.ReturningWork;
import org.hibernate.jdbc.Work;
import com.varasofttech.util.HibernateUtil;
public class Application {
public static void main(String[] args) {
// Different ways to get the Connection object using Session
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
// Way1 - using doWork method
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
// do your work using connection
}
});
// Way2 - using doReturningWork method
Connection connection = session.doReturningWork(new ReturningWork<Connection>() {
@Override
public Connection execute(Connection conn) throws SQLException {
return conn;
}
});
// Way3 - using Session Impl
SessionImpl sessionImpl = (SessionImpl) session;
connection = sessionImpl.connection();
// do your work using connection
// Way4 - using connection provider
SessionFactoryImplementor sessionFactoryImplementation = (SessionFactoryImplementor) session.getSessionFactory();
ConnectionProvider connectionProvider = sessionFactoryImplementation.getConnectionProvider();
try {
connection = connectionProvider.getConnection();
// do your work using connection
} catch (SQLException e) {
e.printStackTrace();
}
}
}
それは私を助けました。
hibenate 4.3の場合、これを試してください。
public static Connection getConnection() {
EntityManager em = <code to create em>;
Session ses = (Session) em.getDelegate();
SessionFactoryImpl sessionFactory = (SessionFactoryImpl) ses.getSessionFactory();
try{
connection = sessionFactory.getConnectionProvider().getConnection();
}catch(SQLException e){
ErrorMsgDialog.getInstance().setException(e);
}
return connection;
}
これを試して:
public Connection getJavaSqlConnectionFromHibernateSession() {
Session session = this.getSession();
SessionFactoryImplementor sessionFactoryImplementor = null;
ConnectionProvider connectionProvider = null;
java.sql.Connection connection = null;
try {
sessionFactoryImplementor = (SessionFactoryImplementor) session.getSessionFactory();
connectionProvider = (ConnectionProvider) sessionFactoryImplementor.getConnectionProvider().getConnection();
connection = connectionProvider.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
Connection conn = null;
PreparedStatement preparedStatement = null;
try {
Session session = (org.hibernate.Session) em.getDelegate();
SessionFactoryImplementor sfi = (SessionFactoryImplementor) session.getSessionFactory();
ConnectionProvider cp = sfi.getConnectionProvider();
conn = cp.getConnection();
preparedStatement = conn.prepareStatement("Select id, name from Custumer");
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
System.out.print(rs.getInt(1));
System.out.println(rs.getString(2));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (preparedStatement != null) {
preparedStatement.close();
}
if (conn != null) {
conn.close();
}
}
これは、実際にはまだ何もせずにConnection
、によって使用されたものを返すJava8メソッドEntityManager
です。
private Connection getConnection(EntityManager em) throws SQLException {
AtomicReference<Connection> atomicReference = new AtomicReference<Connection>();
final Session session = em.unwrap(Session.class);
session.doWork(connection -> atomicReference.set(connection));
return atomicReference.get();
}