하이버 네이트 Session
은 스레드로부터 안전하지 않으므로 현재 스레드에 대한 현재 세션을 가져 오는 전략이 필요합니다. 이러한 전략을 CurrentSessionContext
이라고합니다.
현재의 세션은 우리가이 호출에 의해 얻을 세션 :
sessionFactory.getCurrentSession()
Hibernate는 다양한 현재 세션 전략을 구성 할 수 있습니다. @UnitOfWork
는이 전략을 사용한다 : 우리가 Session
는 스레드로부터 안전하지 않습니다 알고, 그래서
ManagedSessionContext.bind(session)
의 명시 적으로 호출하여 컨텍스트에 세션을 넣어 당신이해야이 전략
hibernate.current_session_context_class = managed
당신 별도의 스레드에 대한 새 세션을 만들고 해당 세션을 ManagedSessionContext
에 두어야합니다. 그 후에는 @UnitOfWork
으로 끝점 방법과 동일한 방식으로 DAO를 호출 할 수 있습니다. 당신은 당신은 별도의 스레드에 대한 세션을 만들려면이 유틸리티 클래스를 사용할 수 있습니다
ManagedSessionContext.unbind(factory)
로를 닫기 전에 세션을 바인딩을 해제해야 염두에
유지 : guava
에서
public final class HibernateSessionUtils {
private HibernateSessionUtils() {
}
public static void request(SessionFactory factory, Runnable request) {
request(factory,() -> {
request.run();
return null;
});
}
public static <T> T request(SessionFactory factory, Supplier<T> request) {
Transaction txn = null;
Session session = factory.openSession();
try {
ManagedSessionContext.bind(session);
txn = session.beginTransaction();
T result = request.get();
commit(txn);
return result;
} catch (Throwable th) {
rollback(txn);
throw Throwables.propagate(th);
} finally {
session.close();
ManagedSessionContext.unbind(factory);
}
}
private static void rollback(Transaction txn) {
if (txn != null && txn.isActive()) {
txn.rollback();
}
}
private static void commit(Transaction txn) {
if (txn != null && txn.isActive()) {
txn.commit();
}
}
}
Throwables
.
는 당신이 당신은 어디서나 Guice
를 사용하여 공장을 주입 할 수있는 세션을
sessionFactory.getCurrentSession()
를 얻을 수있는 dao.getCampaigns()
방법은이 방법
List<Campaign> getCampaigns(SessionFactory factory, CampaignDao dao) {
return HibernateSessionUtils.request(
factory,
dao::getCampaigns
);
}
사용할 수 있습니다.
다른 옵션은 UnitOfWorkAwareProxyFactory
입니다.