हमें java.sql.Connection
हाइबरनेट सत्र से संबंधित होने में सक्षम होना चाहिए । कोई अन्य कनेक्शन काम नहीं करेगा, क्योंकि यह कनेक्शन चल रहे लेनदेन से जुड़ा हो सकता है।
यदि session.connection () अब पदावनत हो गया है, तो मुझे यह कैसे करना चाहिए?
हमें java.sql.Connection
हाइबरनेट सत्र से संबंधित होने में सक्षम होना चाहिए । कोई अन्य कनेक्शन काम नहीं करेगा, क्योंकि यह कनेक्शन चल रहे लेनदेन से जुड़ा हो सकता है।
यदि session.connection () अब पदावनत हो गया है, तो मुझे यह कैसे करना चाहिए?
जवाबों:
अब आपको वर्क एपीआई का उपयोग करना होगा:
session.doWork(
new Work() {
public void execute(Connection connection) throws SQLException
{
doSomething(connection);
}
}
);
या, जावा 8+ में:
session.doWork(connection -> doSomething(connection));
SessionImpl sessionImpl = (SessionImpl) session; Connection conn = sessionImpl.connection();
आप तब कनेक्शन ऑब्जेक्ट का उपयोग कहीं भी कर सकते हैं, जिसकी आपको उस कोड में आवश्यकता होती है, न कि केवल एक छोटी विधि तक सीमित।
session.doWork(this::doSomething)
। यदि आप एक परिणाम वापस करना चाहते हैं - doReturningWork ()
यदि
session.connect()
अब पदावनत कर दिया जाता है, तो मुझे यह कैसे करना चाहिए?
आपको जावाडॉक में उल्लिखित एपीआई Session#doWork(Work)
और Work
एपीआई का उपयोग करना होगा :
connection()
पदावनत किया हुआ। (4.x में हटाने के लिए निर्धारित)। प्रतिस्थापन आवश्यकता पर निर्भर करता है; प्रत्यक्ष JDBC सामान उपयोग करने के लिएdoWork(org.hibernate.jdbc.Work)
; 'अस्थायी सत्र' का उपयोग (टीबीडी) खोलने के लिए।
आपके पास Hibernate 4.x से पहले कुछ समय है, लेकिन, अच्छी तरह से, एक अपग्रेड किए गए एपीआई का उपयोग करके किसी तरह इस तरह दिखता है:
:)
अपडेट: आरई के अनुसार : [हाइबरनेट-देव] हाइबरनेट-देव सूची में शामिल होने वाला कनेक्शन , ऐसा लगता है कि डिप्रैशन का प्रारंभिक उद्देश्य उपयोग को हतोत्साहित Session#connection()
करना था क्योंकि इसे "खराब" एपीआई माना जाता था, लेकिन यह उस समय रहना था। मुझे लगता है कि उन्होंने अपना मन बदल दिया ...
Session#connection()
हाइबरनेट कोर 3.3 में javadoc विकल्प का उल्लेख है) और यह आमतौर पर कुछ पाठकों का अनुमान नहीं लगा सकता है।
hibernate
) का उपयोग कर रहे हैं और न hibernate-core
कि जिसके हाल के संस्करण हैं। और अंतिम संस्करणों (3.5.x) के लिए, वे JBoss Nexus रिपॉजिटरी में उपलब्ध हैं ।
इसे इस्तेमाल करे
((SessionImpl)getSession()).connection()
Actuly getSession रिटर्न सत्र इंटरफ़ेस प्रकार, आपको यह देखना चाहिए कि सत्र के लिए मूल वर्ग क्या है, मूल वर्ग पर टाइप करें फिर कनेक्शन प्राप्त करें।
सौभाग्य!
SessionImpl
हाइबरनेट के एक आंतरिक पैकेज में है (इसलिए इसका उपयोग करने का इरादा नहीं है) और यह भी कि वास्तविक कार्यान्वयन पर निर्भरता है। इसके अलावा, आप अपने परीक्षणों में सत्र को आसानी से नहीं रोक सकते, जब आप इसे डालते हैं।
अभी भी बहुत सारे कलाकारों के साथ एक और विकल्प शामिल है, लेकिन कम से कम इसे प्रतिबिंब की आवश्यकता नहीं है, जो आपको वापस संकलन का समय देगा:
public Connection getConnection(final EntityManager em) {
HibernateEntityManager hem = (HibernateEntityManager) em;
SessionImplementor sim = (SessionImplementor) hem.getSession();
return sim.connection();
}
आप निश्चित रूप से कुछ instanceof
चेक के साथ "प्रेटियर" भी बना सकते हैं , लेकिन ऊपर दिया गया संस्करण मेरे लिए काम करता है।
यहाँ यह हाइबरनेट 4.3 में करने का एक तरीका है, और इसे पदावनत नहीं किया गया है:
Session session = entityManager.unwrap(Session.class);
SessionImplementor sessionImplementor = (SessionImplementor) session;
Connection conn = sessionImplementor.getJdbcConnectionAccess().obtainConnection();
session
करना सुरक्षित है SessionImplementor
?
यह वही है जो मैं उपयोग करता हूं और मेरे लिए काम करता हूं। सत्र ऑब्जेक्ट को एक सत्र I में डुबोएं और कनेक्शन ऑब्जेक्ट को आसानी से प्राप्त करें:
SessionImpl sessionImpl = (SessionImpl) session;
Connection conn = sessionImpl.connection();
session
आपके हाइबरनेट सत्र ऑब्जेक्ट का नाम कहां है।
connection()
बस इंटरफ़ेस पर पदावनत किया गया था। यह अभी भी उपलब्ध हैSessionImpl
। आप वह कर सकते हैं जो स्प्रिंग करता है और बस उसी को कॉल करें।
यहाँ HibernateJpaDialect
स्प्रिंग 3.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();
}
}
यहाँ एक जावा 8 विधि है जिसका Connection
उपयोग 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();
}