하이버네이트 SessionFactory

Hibernate SessionFactory는 세션을 얻고 데이터베이스 작업을 수행하는 공장 클래스입니다.

Hibernate SessionFactory

Hibernate SessionFactory는 세션 개체를 얻을 수 있는 세 가지 메서드를 제공합니다 – getCurrentSession(), openSession()openStatelessSession().

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)

이 세션 객체는 하이버네이트 컨텍스트에 속하기 때문에 닫을 필요가 없습니다. 세션 팩토리가 닫히면 이 세션 객체도 닫힙니다. 하이버네이트 세션 객체는 스레드 안전하지 않으므로 멀티 스레드 환경에서 사용해서는 안 됩니다. 새 세션을 열 때보다 상대적으로 빠르기 때문에 단일 스레드 환경에서 사용할 수 있습니다.

하이버네이트 세션 팩토리 openSession

하이버네이트 SessionFactory의 openSession() 메서드는 항상 새로운 세션을 엽니다. 모든 데이터베이스 작업이 완료되면 이 세션 객체를 닫아야 합니다. 멀티 스레드 환경에서는 각 요청마다 새 세션을 열어야 합니다. 웹 애플리케이션 프레임워크에서는 요구에 따라 각 요청마다 새 세션을 열거나 각 세션마다 새 세션을 열 수 있습니다.

하이버네이트 세션 팩토리 openStatelessSession

Hibernate의 `SessionFactory` openStatelessSession() 메소드는 `StatelessSession`의 인스턴스를 반환합니다. `java.sql.Connection` 객체를 전달하여 hibernate에서 상태 비저장 세션 객체를 얻을 수 있는 또 다른 오버로드된 메소드가 있습니다. Hibernate에서 StatelessSession은 1차 캐시를 구현하지 않으며 어떠한 2차 캐시와도 상호작용하지 않습니다. 상태 비저장이므로, 트랜잭셔널 쓰기 지연이나 자동 더티 체킹, 연관된 엔티티에 대한 연쇄 작업도 구현하지 않습니다. 컬렉션 또한 상태 비저장 세션에 의해 무시됩니다. 상태 비저장 세션을 통해 수행된 작업은 Hibernate의 이벤트 모델과 인터셉터를 우회합니다. 이는 일반적인 JDBC 연결과 유사하며 hibernate 프레임워크를 사용함으로써 얻는 이점을 제공하지 않습니다. 그러나 상태 비저장 세션은 특정 상황에서 적합할 수 있습니다. 예를 들어, 대량의 데이터를 데이터베이스에 로딩하는 경우이며 1차 캐시 메모리에 엄청난 데이터를 Hibernate 세션이 보유하지 않기를 원하는 경우입니다. 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();
		
		//현재 세션 - 닫을 필요 없음
		Session currentSession = sessionFactory.getCurrentSession();
		
		//새 세션 열기
		Session newSession = sessionFactory.openSession();
		//DB 작업 수행
		
		//세션 닫기
		newSession.close();
		
		//상태 비저장 세션 열기
		StatelessSession statelessSession = sessionFactory.openStatelessSession();
		//상태 비저장 DB 작업 수행
		
		//세션 닫기
		statelessSession.close();
		
		//세션 닫기 factory
		sessionFactory.close();
		
	}

}

Hibernate에서 SessionFactory와 세션 객체를 얻는 다양한 방법에 대한 설명은 여기까지입니다.

Source:
https://www.digitalocean.com/community/tutorials/hibernate-sessionfactory