우리 java.sql.Connection
는 동면 세션 과 관련된 것을 얻을 수 있어야합니다 . 이 연결은 실행중인 트랜잭션과 연관 될 수 있으므로 다른 연결은 작동하지 않습니다.
session.connection ()이 이제 더 이상 사용되지 않는 경우 어떻게해야합니까?
답변
이제 Work API를 사용해야합니다.
session.doWork(
new Work() {
public void execute(Connection connection) throws SQLException
{
doSomething(connection);
}
}
);
또는 Java 8 이상 :
session.doWork(connection -> doSomething(connection));
답변
경우
session.connect()
현재 사용되지 않습니다, 어떻게 그렇게 하죠?
Javadoc에 언급 된대로 Session#doWork(Work)
및 Work
API 를 사용해야 합니다.
connection()
더 이상 사용되지 않습니다. (4.x에서 제거 예정). 교체는 필요에 따라 다릅니다. 직접 JDBC 물건 사용을 위해doWork(org.hibernate.jdbc.Work)
; ‘임시 세션’사용 (미정)을 열기 위해.
Hibernate 4.x 이전에 약간의 시간이 있지만 더 이상 사용되지 않는 API를 사용하는 것은 다음과 같습니다.
🙂
업데이트 : RE 에 따르면 : [hibernate-dev] hibernate-dev 목록의 Connection proxying , deprecation의 초기 의도 Session#connection()
는 “나쁜”API로 간주 되었기 때문에 사용을 중지하는 것이 었지만 그 시간에 머물기로되어있었습니다. 마음이 바뀌었나 봐 …
답변
이 시도
((SessionImpl)getSession()).connection()
Actuly getSession은 세션 인터페이스 유형을 반환합니다. 세션의 원래 클래스가 무엇인지 확인하고 원래 클래스로 유형 캐스팅 한 다음 연결을 가져옵니다.
행운을 빕니다!
답변
여전히 많은 캐스트가 관련된 또 다른 옵션이 있지만 적어도 리플렉션이 필요하지 않으므로 컴파일 시간을 다시 확인할 수 있습니다.
public Connection getConnection(final EntityManager em) {
HibernateEntityManager hem = (HibernateEntityManager) em;
SessionImplementor sim = (SessionImplementor) hem.getSession();
return sim.connection();
}
물론 몇 번의 instanceof
확인 만으로도 “더 예쁘게”만들 수 있지만 위의 버전이 저에게 적합합니다.
답변
Hibernate 4.3에서이를 수행하는 방법은 다음과 같습니다.
Session session = entityManager.unwrap(Session.class);
SessionImplementor sessionImplementor = (SessionImplementor) session;
Connection conn = sessionImplementor.getJdbcConnectionAccess().obtainConnection();
답변
이것이 내가 사용하고 나를 위해 일하는 것입니다. Session 개체를 SessionImpl로 다운 캐스트하고 연결 개체를 쉽게 가져옵니다.
SessionImpl sessionImpl = (SessionImpl) session;
Connection conn = sessionImpl.connection();
session
Hibernate 세션 객체의 이름은 어디에 있습니까 ?
답변
connection()
인터페이스에서 사용되지 않습니다. 에서 계속 사용할 수 있습니다 SessionImpl
. Spring이하는 일을 할 수 있고 그냥 호출 할 수 있습니다.
다음은 HibernateJpaDialect
Spring 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);
}
}