-
Notifications
You must be signed in to change notification settings - Fork 0
01) helloHibernate
choi jae ho edited this page Mar 5, 2022
·
17 revisions
Hibernate ์ฐ์ต
- Hiberante provides the Object-to-Relational Mapping(ORM)
- Hibernate handles all of the low-level SQL
- JDBC ์ฝ๋์ ์์ ์ต์ํ ํด์ค๋ค.
- SessionFactory๋ฅผ ์ฌ์ฉํด์ session์ ๋ง๋ค์ด DB์ ์ปค๋ฎค๋์ผ์ด์ ํ๋ค.
- hibernate.cfg.xml
- *.hbm.xml class mappings : ๊ฐ์ฒด์ ํ ์ด๋ธ ์ฌ์ด์ ๋งคํ์ ํ๋ ๋ถ๋ถ
- Hibernate Config (์ค์ ์ ๋ณด) : hibernate.cfg.xml ์ ์ฝ์
- Hibernate Mapping (๋งคํ์ ๋ณด) : *.hbm.xml class mappings ์ ์ฝ์
- Configuration์์ SessionFactory๋ฅผ ๋ง๋ ๋ค. (singleton)
- SessionFactory์์ Session์ ๋ง๋ค๊ณ ์ด ์ธ์ ์ด JDBC๋ฅผ ์ฌ์ฉํ์ฌ Database์ ์ ๊ทผ์ ํ๋ค.
- Transaction๋ Session์์ ๋ง๋ค์ด์ค๋ค.
- application and database ์ฌ์ด์ connection ์ ์ป๊ธฐ ์ํจ.
- thread safe ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ค๋ซ๋์ ์ด์ด ๋์ง ์๋๋ค.
- entity classes ์ ๋ํด crud ๋ฅผ ์ ๊ณตํด์ค๋ค.
- hibernate์์ cache๋ฅผ ์ฌ์ฉ, ํ๊บผ๋ฒ์ ๋ชจ์์ ์ ์ฅํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค. (ํผํฌ๋จผ์ค์ ์ํฅ)
- Instances of entity classes may exist in one of the following three states
- Transient : ๋ฉ๋ชจ๋ฆฌ์ํ์ ๋จ์์ ธ์์
- Persistent : ์์์ ์ธ ์ํ
- Detached : ์ธ์ ๊ณผ ๋ถ๋ฆฌ๋จ
public class HibernateTest {
public static void main() {
Person person = new Person(); // Transient Object
person.setUserName("Test User");
SessonFactory sessionFactory =
new Configuration().configure().buildSessionFactory();
Sesson session = SessionFactory.openSession();
session.beginTransaction();
session.save(person); // Persistent Object
// Any Changes made to the persistent object get reflected in the DB
person.setUserName("Updated User");
person.setUserName("Updated User Again");
session.getTransaction().commit();
session.close();
// Detached Object; hibernate is not going to track the changes
person.setUserName("Updated User After session close");
}
}
์์กด์ฑ ์ถ๊ฐ
- Hibernate-core
- MySQL Connector
- lombok
- logback
<!-- Hibernate Dependency ์ถ๊ฐ. -->
<!-- Hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.29.Final</version>
</dependency>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<!-- logback -->
<!-- logback-classic๋ง ๋ฃ์ด์ฃผ๋ฉด, core๋ ๋ค์ด๊ฐ -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>runtime</scope>
</dependency>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- JDBC Database connection settings -->
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/testdb?useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Seoul</property>
<property name="connection.username">root</property>
<property name="connection.password">hansung</property>
<!-- Select our SQL dialect ๋ฐฉ์ธ..-->
<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="show_sql">true</property>
<property name="current_session_context_class">thread</property>
<property name="hbm2ddl.auto">create</property> <!-- create ํ
์ด๋ธ์ ์๋์ผ๋ก ์์ฑํด ์ค๋ค. drop : ์ข
๋ฃ๋๋ฉด ์ญ์ -->
<mapping class="helloHibernate.Product"/> <!-- mapping ํด์ ๋ฐ๋ก ๋ง๋ค์ด ์ค๋ค. -->
</session-factory>
</hibernate-configuration>
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- console Appender -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>.%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %n
</Pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>TRACE</level>
</filter>
</appender>
<logger name="kr.ac.hansung.cse">
<level value="DEBUG" />
</logger>
<!-- org.hibernate์ ๋ํด์ ์์ธํ ๋ณด๊ธฐ ์ํด ์ถ๊ฐ. -->
<logger name="org.hibernate.type.descriptor.sql">
<level value="Trace" />
</logger>
<root>
<level value="INFO" />
<appender-ref ref="consoleAppender" />
</root>
</configuration>
package helloHibernate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/*
* Entity class : Java class that is mapped to a database table
*
* Java Annotations
* - map class to database table
* - map fields to database columns
*
*/
@Getter
@Setter
@ToString
@Entity
@Table(name="product")
public class Product {
@Id //id๋ก ์ฌ์ฉ. primary key
@GeneratedValue //ํค๋ฅผ ์์ฑํ ๋๋, ์๋์ผ๋ก ์์ฑํ๋ค.
@Column(name="product_id") //์ปฌ๋ผ ๋ด์ฉ์ ์ง์ ํด์ค ์ ์๋ค. - ๋ง์ฝ์ name์ ์ง์ ํ์ง ์๋๋ค๋ฉด, field์ด๋ฆ๊ณผ ๊ฐ์ ์ง๋ค.
private int id;
private String name;
private int price;
private String description;
}
package helloHibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
//JAVA Application์์ ์ฌ์ฉํ๋ ๋ฒ.
public class TestMain {
private static SessionFactory sessionFactory; //Spring ์์๋ DI
public static void main(String[] args) {
//์ธ์
ํํ ๋ฆฌ ์ป์ด ์ค๋ ๊ณผ์ .
/*
* Configuration conf = new Configuration(); conf.configure();
*
* sessionFactory = conf.buildSessionFactory(); //์ค์ ํ์ผ ๋ช
์ = Default ์ด๋ฆ : hibernate.cfg.xml
*/
sessionFactory = new Configuration().configure().buildSessionFactory(); //chained method
Product product1 = new Product();
product1.setName("Notebook");
product1.setPrice(2000);
product1.setDescription("Awesome notebook");
Session session = sessionFactory.openSession(); //์ธ์
์ ๋ง๋ ๋ค.
Transaction tx = session.beginTransaction(); //ํธ๋์ ์
์์
session.save(product1); //์๋์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋จ.
tx.commit(); //ํธ๋์ ์
commit
session.close(); //์ธ์
์ ๋ซ์.
sessionFactory.close(); //์ธ์
ํฉํ ๋ฆฌ ๋ซ์.
}
}
logback์ ์ถ๊ฐํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ค ๊ฐ์ด ๋์๋์ง console์์ ํ์ธ ๊ฐ๋ฅ
<!-- org.hibernate์ ๋ํด์ ์์ธํ ๋ณด๊ธฐ ์ํด ์ถ๊ฐ. -->
<logger name="org.hibernate.type.descriptor.sql">
<level value="Trace" />
</logger>
MySQL workbench | testdb ํ์ธ
package helloHibernate;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
//JAVA Application์์ ์ฌ์ฉํ๋ ๋ฒ.
public class TestMain {
private static SessionFactory sessionFactory; //Spring ์์๋ DI
public static void main(String[] args) {
//์ธ์
ํํ ๋ฆฌ ์ป์ด ์ค๋ ๊ณผ์ .
/*
* Configuration conf = new Configuration(); conf.configure();
*
* sessionFactory = conf.buildSessionFactory(); //์ค์ ํ์ผ ๋ช
์ = Default ์ด๋ฆ : hibernate.cfg.xml
*/
sessionFactory = new Configuration().configure().buildSessionFactory(); //chained method
Product product1 = new Product();
product1.setName("Notebook");
product1.setPrice(2000);
product1.setDescription("Awesome notebook");
Product product2 = new Product();
product2.setName("Notebook2");
product2.setPrice(3000);
product2.setDescription("Powerful notebook");
Session session = sessionFactory.openSession(); //์ธ์
์ ๋ง๋ ๋ค.
Transaction tx = session.beginTransaction(); //ํธ๋์ ์
์์
session.save(product1);
session.save(product2);
//๋ฐ๋ก DB์ ์ ์ฅ๋์ง ์์.
//์บ์์ ์์.
/*
* Serializable id1 = session.save(product1); //id๋ฅผ ๊ธฐ์ตํจ.
* Product savedProduct = session.get(Product.class, id1);
* System.out.println("saved product " + savedProduct); //์บ์์ ์ ์ฅ๋๊ฑธ ์ฝ์ด์ด.
* session.save(product1);
*/
Query<Product> aQuery = session.createQuery("from Product order by name", Product.class); //HQL ์ฌ์ฉ
List <Product> products = aQuery.getResultList(); //์กฐํ
System.out.println(products);
tx.commit(); //ํธ๋์ ์
commit - ์ด๋ DB์ ์ ์ฅ๋จ.
session.close(); //์ธ์
์ ๋ซ์.
sessionFactory.close(); //์ธ์
ํฉํ ๋ฆฌ ๋ซ์.
}
}
์ถ๊ฐ๋ ์ ๋ณด๋ค ์กฐํ
MySQL workbench | testdb ํ์ธ
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ฑ
package helloHibernate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@Entity
@Table(name="category")
public class Category {
@Id
@GeneratedValue
@Column(name="category_id")
private int id;
private String name;
}
@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="category_id")
private Category category;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
//JAVA Application์์ ์ฌ์ฉํ๋ ๋ฒ.
public class TestMain {
private static SessionFactory sessionFactory; //Spring ์์๋ DI
public static void main(String[] args) {
//์ธ์
ํํ ๋ฆฌ ์ป์ด ์ค๋ ๊ณผ์ .
/*
* Configuration conf = new Configuration(); conf.configure();
*
* sessionFactory = conf.buildSessionFactory(); //์ค์ ํ์ผ ๋ช
์ = Default ์ด๋ฆ : hibernate.cfg.xml
*/
sessionFactory = new Configuration().configure().buildSessionFactory(); //chained method
Category category1 = new Category();
category1.setName("์ปดํจํฐ");
Category category2 = new Category();
category2.setName("์๋์ฐจ");
Product product1 = new Product();
product1.setName("Notebook1");
product1.setPrice(2000);
product1.setDescription("Awesome notebook");
product1.setCategory(category1);
Product product2 = new Product();
product2.setName("Notebook2");
product2.setPrice(3000);
product2.setDescription("Powerful notebook");
product2.setCategory(category1);
Product product3 = new Product();
product3.setName("Sonata");
product3.setPrice(100000);
product3.setDescription("Popular Car");
product3.setCategory(category2);
Session session = sessionFactory.openSession(); //์ธ์
์ ๋ง๋ ๋ค.
Transaction tx = session.beginTransaction(); //ํธ๋์ ์
์์
session.save(product1);
session.save(product2);
session.save(product3);
product1.setCategory(null);
session.delete(product1);
//๋ฐ๋ก DB์ ์ ์ฅ๋์ง ์์.
//์บ์์ ์์.
/*
* Serializable id1 = session.save(product1); //id๋ฅผ ๊ธฐ์ตํจ.
* Product savedProduct = session.get(Product.class, id1);
* System.out.println("saved product " + savedProduct); //์บ์์ ์ ์ฅ๋๊ฑธ ์ฝ์ด์ด.
* session.save(product1);
*/
/*
* Query<Product> aQuery = session.createQuery("from Product order by name",
* Product.class); //HQL ์ฌ์ฉ List <Product> products = aQuery.getResultList();
* //์กฐํ System.out.println(products);
*/
tx.commit(); //ํธ๋์ ์
commit - ์ด๋ DB์ ์ ์ฅ๋จ.
session.close(); //์ธ์
์ ๋ซ์.
sessionFactory.close(); //์ธ์
ํฉํ ๋ฆฌ ๋ซ์.
}
}
<mapping class="helloHibernate.Category"/>