하이버네이트에서는 단일 행 가져오기라는 개념이 있습니다. 각각의 데이터베이스 테이블에서 단일 행을 가져오기 위해 우리는 또는get() 또는 load()를 사용할 것입니다.
get()
get()는 항상 데이터베이스에 접근합니다.
시리얼라이저블 ID가 발견되면 해당 세부 정보를 얻게 됩니다.
예시
SwingBowlers swingBowlers = (SwingBowlers) openSession.get(SwingBowlers.class,1);
시리얼라이저블 ID는 1(jerSeyNo)이며 –> 기본 키입니다.
만약 직렬화 ID가 찾을 수 없다면, 그 결과는 null이 됩니다.load()
load()는 항상 프록시 객체를 생성합니다.직렬화 ID가 발견되면, 해당하는 세부 정보를 얻게 됩니다.
예시
SwingBowlers swingBowlers = (SwingBowlers) openSession.get(SwingBowlers.class, 1);
System.out.println(swingBowlers);
직렬화 ID는 1 (jerSeyNo) –> 기본 키
시리얼라이제이션 ID가 존재하지 않는 경우, 결과로 org.hibernate의ObjectNotFoundException예외가 발생합니다.
로드 메서드를 사용하고 있지만, 객체 세부 정보를 출력하려고 할 때(예: System.out.println(swingBowlers);) 쿼리가 여전히 생성되는지 확인해야 합니다. 하지만 이는 Proxy Object[Dummy Object]에서만 발생합니다.
실제로 살펴보겠습니다.
HibernateTutorialRun.java
package com.blogspot.javacodebypj;
import com.blogspot.javacodebypj.dao.SwingBowlersDaoImpl;
public class HibernateTutorialRun {
public static void main(String[] args) {
SwingBowlersDaoImpl sbdi = new SwingBowlersDaoImpl();
sbdi.getSwingBowlers();
}
}
설명: HibernateTutorialRun 은 HibernateTutorial 애플리케이션을 실행하기 위한 클래스로, 서버 없이 사용하고 있습니다. Hibernate는 서버와 함께 또는 서버 없이 실행될 수 있습니다. 우리는 메인 메서드를 생성하고, 그 안에서 해당 클래스 SwingBowlersDaoImpl 의 객체를 생성했습니다. 그리고 나서 그 객체 참조를 사용하여 해당 메서드를 호출하고 있습니다.
SwingBowlersDao.java
package com.blogspot.javacodebypj.dao;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.blogspot.javacodebypj.domain.SwingBowlers;
import com.blogspot.javacodebypj.util.HibernateUtil;
public class SwingBowlersDaoImpl implements SwingBowlersDao {
@Override
public void getSwingBowlers() {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session openSession = sessionFactory.openSession();
// load 메서드 사용
SwingBowlers swingBowlers = (SwingBowlers) openSession.load(SwingBowlers.class, 1);
System.out.println(swingBowlers);
}
}
설명: 우리는 방금 SwingBowlersDaoImpl 클래스를 생성하고 이를 SwingBowlersDao 와 함께 구현했으며, 해당 메서드를 오버라이드하려고 합니다. 우리는 HibernateUtil 클래스의 메서드, 즉 getSessionFactory 메서드를 호출하려고 합니다. 이 메서드를 통해 SessionFactory 객체를 얻을 것이고, 이 SessionFactory 객체 참조를 사용하여 openSession 메서드를 호출할 것입니다. 그런 다음 Session 객체를 얻게 됩니다.
일단 이 세션으로 세션 객체를 얻으면, Session 객체를 사용하여 load 메서드나 get 메서드를 호출할 수 있으며, load 메서드나 get 메서드가 Object를 반환하기 때문에 해당 클래스로 캐스팅해야 합니다. Java에서의 업캐스팅과 다운캐스팅 개념을 아실 것으로 기대합니다.
SwingBowlers.java
package com.blogspot.javacodebypj.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class SwingBowlers {
@Id
@Column(length = 3)
private int jerseyNo;
@Column(length = 15)
private String bowlerName;
@Column(length = 10)
private String country;
public int getJerseyNo() {
return jerseyNo;
}
public void setJerseyNo(int jerseyNo) {
this.jerseyNo = jerseyNo;
}
public String getBowlerName() {
return bowlerName;
}
public void setBowlerName(String bowlerName) {
this.bowlerName = bowlerName;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Override
public String toString() {
return "SwingBowlers [jerseyNo=" + jerseyNo + ", bowlerName=" + bowlerName + ", country=" + country + "]";
}
}
설명: 우리는 필드를 데이터베이스 컬럼에 매핑하고 있습니다. 데이터베이스 테이블의 컬럼과 동일한 필드 이름이 있다면, 어노테이션 수준에서 컬럼 이름 값을 작성할 필요가 없습니다. 마찬가지로, 테이블 이름도 클래스 이름과 동일합니다 SwingBowlers그래서 @Table 어노테이션을 사용하지 않았습니다. 도메인 클래스로 만들기 위해, 우리는 해당 클래스 상단에 @Entity 어노테이션을 사용하고 있습니다.
HibernateUtil.java
package com.blogspot.javacodebypj.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory;
private HibernateUtil() {
}
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
Configuration conf = new Configuration().configure();
sessionFactory = conf.buildSessionFactory();
}
return sessionFactory;
}
}
설명: 우리는 단지 SessionFactory를 싱글톤 클래스로 생성했습니다.
hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver
</property>
<property name="connection.url">jdbc:mysql://localhost:3306/cricketer</property>
<property name="connection.username">root</property>
<property name="connection.password">myRoot4*</property>
<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<mapping class="com.blogspot.javacodebypj.domain.SwingBowlers" />
</session-factory>
</hibernate-configuration>
설명: 여기에는 세 가지 섹션이 있습니다:
- 데이터베이스 관련 속성
- 하이버네이트 관련 속성
- 매핑 클래스
아시다시피, 우리는 하이버네이트 매핑 XML 파일을 사용하지 않으므로, 그것이 매핑 클래스에 대해 간단히 언급한 이유입니다.
방언: 이는 데이터베이스에 대한 쿼리 생성을 위해 사용됩니다. 이 애플리케이션에서는 MySQL 데이터베이스를 사용하고 있습니다.
show_sql: 쿼리를 생성한 후에는 쿼리를 보고 싶으므로 이를 true로 지정해야 합니다.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.blogspot.javacodebypj</groupId>
<artifactId>HibernateTutorial</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>HibernateTutorial</name>
<description>HibernateTutorial by Ponnam Jay</description>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.14.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
</project>
설명: 우리는 이 Maven 프로젝트 구조를 Eclipse IDE를 통해 간단한 Maven 프로젝트로 생성했습니다. 종속성으로 hibernate-core, mysql-connector-java 등을 추가하고 Java 1.8을 사용하여 pom.xml의 속성 섹션에서 target과 source를 관찰했습니다.
데이터베이스 세부 정보
결론
단일 행(단일 레코드)을 가져오려면 get 메서드 [또는] load 메서드를 사용할 수 있습니다.