3.1 Hibernate와 데이터베이스 연결하기

우리는 Maven을 사용하여 Hibernate를 애플리케이션에 연결하는 방법과 주석을 사용하여 테이블을 클래스에 매핑하는 방법을 배웠습니다. 이제 다음 질문이 생깁니다. 데이터베이스에서 개체를 읽거나 저장하는 방법은 무엇입니까?

그렇게 빠르지 않습니다. 우선 다음 세 가지를 더 처리해야 합니다.

  • 데이터베이스 연결 구성
  • 최대 절전 모드 설정
  • EntityManager 작업

Hibernate는 애플리케이션에서 데이터베이스에 대한 작업을 완전히 숨기지만 초과를 방지하려면 올바르게 구성해야 합니다. 이 단계를 건너뛸 수 없습니다. 그렇지 않으면 Hibernate가 객체를 저장할 데이터베이스를 어떻게 알 수 있습니까?

세 가지 방법으로 Hibernate를 구성하고 데이터베이스 정보를 제공할 수 있습니다.

  • 속성 파일 사용
  • hibernate.cfg.xml 파일 사용
  • 구성 bean 메소드 사용

그리고 나는 마지막 것이 가장 마음에 들지만 분명히 세 가지를 모두 만날 것이므로 여기서 세 가지를 모두 분석할 것입니다.

3.2 데이터베이스에서 인증

가장 중요한 데이터베이스 연결부터 시작하겠습니다. 이렇게 하려면 Hibernate가 원하는 데이터베이스에 로그인할 수 있도록 데이터를 제공해야 합니다.

속성 파일 구성
최대 절전 모드.속성
hibernate.dialect= org.hibernate.dialect.Oracle9Dialect
hibernate.connection.driver_class= oracle.jdbc.driver.OracleDriver 
hibernate.connection.url= jdbc:oracle:thin:@localhost:1521:supershop
hibernate.connection.username=root
hibernate.connection.password=secret
hibernate.show_sql=true
hibernate.hbm2ddl=update

동일한 설정을 xml 파일 형식으로 설정할 수 있습니다.

XML 기반 구성
최대 절전 모드.cfg.xml

<hibernate-configuration>	
	<session-factory>	
        	
    	<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>  	
    	<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 	
    	<property name="connection.url">jdbc:oracle:thin:@localhost:1521:supershop</property>  	
    	<property name="connection.username">root</property>  	
    	<property name="connection.password">secret</property>
    	<property name="hibernate.show_sql ">true</property>        
    	<property name="hbm2ddl.auto">update</property> 	
     	
	</session-factory>	
</hibernate-configuration> 

두 예에서 동일한 값을 가진 동일한 설정을 볼 수 있습니다. 첫 번째 예는 그것들을 속성 파일 로 나타내고 두 번째 예는 xml 파일 로 나타냅니다 .

이러한 설정은 세 그룹으로 나뉩니다.

  1. DBMS 유형 지정
    • 언어(DBMS 유형)를 지정합니다(예: Oracle 9.0).
    • 이 DBMS 작업을 위한 JDBC 드라이버의 이름을 지정하십시오.
  2. 데이터베이스에서 권한 부여를 위한 데이터 지정
    • 데이터베이스 URL
    • 사용자 이름
    • 비밀번호
  3. Hibernate 엔진 구성
    • hibernate.show_sql- Hibernate는 실행하는 모든 요청을 콘솔에 복제합니다.
    • hbm2ddl.auto- Hibernate는 필요한 경우 데이터베이스 구조를 변경합니다.

빈을 통해 구성을 설정하는 세 번째 방법이 있습니다. 주로 Spring과 함께 사용하므로 SpringFramework를 배울 때 살펴보도록 하겠습니다.

3.3 SessionFactory 얻기

다음 단계는 SessionFactory 개체를 가져오는 것입니다. 이를 수행하는 방법에는 여러 가지가 있습니다.

첫 번째 방법은 hibernate.properties 파일을 사용하는 것 입니다 .

이렇게 하려면 다음 코드를 작성하기만 하면 됩니다.

SessionFactory sessionFactory = new Configuration().buildSessionFactory();

현재 프로젝트 디렉토리에서 hibernate.properties 파일을 찾을 수 없으면 예외가 발생합니다.

두 번째 방법은 hibernate.cfg.xml을 사용하여 구성하는 것 입니다 .

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

이러한 코드를 작성하면 hibernate.cfg.xml. 그러한 파일이 없으면 메서드는 buildSessionFactory()예외를 throw합니다.

세 번째 방법은 구성 파일을 수동으로 설정하는 것 입니다 .

때때로 개발 프로세스 중에 테스트 베이스로 전환하거나 베이스 작업을 위한 다른 설정을 변경해야 하는 경우가 있습니다. 이를 위해 구성 파일을 수동으로 설정할 수 있습니다.

SessionFactory sessionFactory = new Configuration().configure("hibernate-dev.cfg.xml").buildSessionFactory();

방법 4 - 맞춤형 hibernate.properties 파일을 사용합니다.

ClassLoader classLoader = Thread.currentThread().getClassLoader();

Properties properties = new Properties();
properties.load(classLoader.getResourceAsStream("hibernate-dev.properties"));

SessionFactory sessionFactory = new Configuration()
            .addProperties(properties)
            .buildSessionFactory();

마지막으로 필요한 모든 매개 변수를 코드에 직접 연결할 수 있습니다.

Properties properties = new Properties();
properties.put(Environment.DRIVER, "com.mysql.jdbc.Driver");
properties.put(Environment.URL, "jdbc:mysql://localhost:3306/supershop");
properties.put(Environment.USER, "root");
properties.put(Environment.PASS, "password");

SessionFactory sessionFactory = new Configuration()
            .setProperties(properties)
            .buildSessionFactory();

3.4 엔티티 클래스를 찾을 위치 지정

그러나 그것이 전부는 아닙니다. Hibernate에서 SessionFactory 객체를 구성할 때 이 SessionFactory는 필요한 열 유형을 가진 모든 필수 테이블이 데이터베이스에 존재하는지 확인합니다.

그리고 SessionFactory가 이를 수행할 수 있으려면 데이터베이스에 매핑해야 하는 엔터티 클래스 목록을 전달해야 합니다.

엔터티 클래스 목록을 전달하는 세 가지 방법이 있습니다.

방법 1. hibernate.cfg.xml다음과 같은 줄을 추가 하십시오 .

<mapping class="class-qualified-name" />

예:

<mapping class="com.codegym.data.User" />
<mapping class="com.codegym.data.Employee" />
<mapping class="com.codegym.data.Task" />

방법 2. Configuration 개체에서 메서드를 호출합니다 addAnnotatedClass(). 예:

SessionFactory sessionFactory = new Configuration()
   	.configure()
   	.addAnnotatedClass(com.codegym.data.User.class)
   	.buildSessionFactory();

클래스가 많으면 전체 패키지에 추가할 수 있습니다.

SessionFactory sessionFactory = new Configuration()
   	.configure()
   	.addPackage("com.codegym.data")
   	.buildSessionFactory();

3.5 최종 예시

이제 SessionFactory 개체를 구성하는 방법을 배웠으므로 이를 사용할 코드를 작성해 보겠습니다.

세 가지 방법으로 구성됩니다.

  1. 최대 절전 모드 구성
  2. 데이터베이스에서 모든 직원을 가져오는 방법
  3. 신입 사원을 데이터베이스에 저장하는 방법

이 코드 템플릿은 다음과 같습니다.

class EmployeeManager {
    private SessionFactory sessionFactory;

    public void class init() {
    	this.sessionFactory = new Configuration()
        	.configure()
        	.buildSessionFactory();
   }

   public List<Employee> getAllEmployes() {
         try (Session session = sessionFactory.openSession()) {
  	          Query<Employee> query = session.createQuery("from Employee", Employee.class);
    	        return query.list();
         }
   }

   public void addEmployee(Employee employee ) {
     	try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
       	    session.save(employee);
            transaction.commit();
     	}
   }
}

데이터베이스에 대한 쿼리를 실행하기 전에 별도의 세션을 생성해야 합니다. 요청이 관련된 경우 동일한 세션에서 실행할 수 있습니다. 요청이 관련되지 않은 경우(그리고 요청 사이에 몇 분이 소요될 수 있음) 자체 세션을 만들어야 합니다.

데이터베이스에서 데이터를 읽거나 복잡한 쿼리를 실행하려면 먼저 쿼리 개체를 만들고 이를 사용하여 쿼리를 실행해야 합니다.

또한 데이터베이스에 대한 각 쿼리는 자체 트랜잭션에서 실행됩니다. 열고 필요한 작업을 수행한 다음 닫아야 합니다(커밋).

다음 강의에서 우리는 이 모든 것이 어떻게 작동하는지 자세히 분석할 것입니다.