웹사이트 검색

Hibernate SessionFactory


Hibernate SessionFactory는 세션을 가져오고 데이터베이스 작업을 수행하는 팩토리 클래스입니다.

Hibernate SessionFactory

Hibernate SessionFactory getCurrentSession

Hibernate SessionFactory getCurrentSession() 메서드는 컨텍스트에 바인딩된 세션을 반환합니다. 하지만 이것이 작동하려면 아래와 같이 hibernate 구성 파일에서 구성해야 합니다.

<property name="hibernate.current_session_context_class">thread</property>

스레드로 구성되지 않은 경우 아래 예외가 발생합니다.

Exception in thread "main" org.hibernate.HibernateException: No CurrentSessionContext configured!
	at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1012)
	at com.journaldev.hibernate.main.HibernateSessionExample.main(HibernateSessionExample.java:16)

이 세션 개체는 최대 절전 모드 컨텍스트에 속하므로 닫을 필요가 없습니다. 세션 팩터리가 닫히면 이 세션 개체가 닫힙니다. Hibernate Session 개체는 스레드로부터 안전하지 않으므로 다중 스레드 환경에서 사용해서는 안 됩니다. 새 세션을 여는 것보다 상대적으로 빠르기 때문에 단일 스레드 환경에서 사용할 수 있습니다.

Hibernate SessionFactory openSession

Hibernate SessionFactory openSession() 메서드는 항상 새 세션을 엽니다. 모든 데이터베이스 작업이 완료되면 이 세션 개체를 닫아야 합니다. 다중 스레드 환경에서 각 요청에 대해 새 세션을 열어야 합니다. 웹 애플리케이션 프레임워크의 경우 요구 사항에 따라 각 요청 또는 각 세션에 대해 새 세션을 열도록 선택할 수 있습니다.

Hibernate SessionFactory openStatelessSession

Hibernate SessionFactory openStatelessSession() 메서드는 StatelessSession의 인스턴스를 반환합니다. 최대 절전 모드에서 상태 비저장 세션 개체를 가져오기 위해 java.sql.Connection 개체를 전달할 수 있는 또 다른 오버로드된 메서드가 있습니다. Hibernate의 StatelessSession은 첫 번째 수준 캐시를 구현하지 않으며 두 번째 수준 캐시와 상호 작용하지 않습니다. 상태 비저장이므로 트랜잭션 비하인드 또는 자동 더티 검사를 구현하거나 연결된 엔터티에 계단식 작업을 수행하지 않습니다. 상태 비저장 세션에서는 컬렉션도 무시됩니다. 무상태 세션을 통해 수행되는 작업은 Hibernate의 이벤트 모델과 인터셉터를 우회합니다. 일반적인 JDBC 연결과 비슷하며 최대 절전 모드 프레임워크를 사용하여 얻을 수 있는 이점을 제공하지 않습니다. 그러나 상태 비저장 세션은 특정 상황에 적합할 수 있습니다. 예를 들어 대량 데이터를 데이터베이스에 로드하고 최대 절전 모드 세션이 첫 번째 수준 캐시 메모리에 대량의 데이터를 보유하는 것을 원하지 않는 경우입니다. Hibernate SessionFactory 메소드 사용법을 보여주는 간단한 프로그램이 아래에 주어진다.

package com.journaldev.hibernate.main;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.StatelessSession;

import com.journaldev.hibernate.util.HibernateUtil;

public class HibernateSessionExample {

	public static void main(String[] args) {
		
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
		
		//Current Session - no need to close
		Session currentSession = sessionFactory.getCurrentSession();
		
		//open new session
		Session newSession = sessionFactory.openSession();
		//perform db operations
		
		//close session
		newSession.close();
		
		//open stateless session
		StatelessSession statelessSession = sessionFactory.openStatelessSession();
		//perform stateless db operations
		
		//close session
		statelessSession.close();
		
		//close session factory
		sessionFactory.close();
		
	}

}

이것이 Hibernate의 SessionFactory에 대한 전부이며 세션 개체를 얻는 방법은 다릅니다.