*code는 [Web Framework2] Week2- Hibernate 실습 코드의 연장입니다.
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 //DB에 매핑되는 클래스를 의미하는 애노테이션
@Table(name="category") //테이블 이름 지정
public class Category {
@Id
@GeneratedValue
@Column(name="category_id")
private int id;
private String name;
}
2.Product.java 클래스에서 category 연결 코드 추가
@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="category_id")
private Category category; //외래키로 사용
3.hibernate.cfg.xml에서 mapping class 추가하기
<mapping class="helloHibernate.Category" />
4.TestMain.java에 test 할 코드 작성하기
1)category 객체 생성
//category 생성
Category category1 = new Category();
category1.setName("컴퓨터"); //id는 @GeneratedValue이므로 별도록 지정 안 함
2)product에 category로 uni-direction 연결 코드 추가
//product 생성
Product product1 = new Product(); // product 객체 생성
product1.setName("Notebook1");
product1.setPrice(2000);
product1.setDescription("Awesome notebook!!");
product1.setCategory(category1); //product에서 category로 uni-direction 연결 생성
3)session.save 로 모든 product 저장
이 때 cascade=All로 설정하였기 때문에 product 저장 시 category도 저장된다.
4)session.delete 경우 주의사항 -> 사전에 setCategory로 null 설정하기
session.delete(product3);// product3 삭제 시 category2도 삭제됨 (product3 -> category2 이므로)
product1.setCategory(null); //product1이 category 지정 안 하도록 사전에 null로 설정
session.delete(product1); //product1과 product2 모두 category1 가리킴 따라서 사전에 product1 -> category1의 연결을 지워야함
<Product.java>
package helloHibernate;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@Entity
@Table(name="product")
public class Product {
@Id
@GeneratedValue
@Column(name="product_id")
private int id;
private String name;
private int price;
private String description;
@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="category_id")
private Category category; //외래키로 사용
}
<hibernate.cfg.xml>
<?xml version="1.0" encoding="UTF-8"?>
<!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">csedbadmin</property> <!-- password는 mysql server에 지정해둔 비밀번호로 입력 -->
<!-- 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>
<mapping class="helloHibernate.Product" />
<mapping class="helloHibernate.Category" />
</session-factory>
</hibernate-configuration>
<TestMain.java>
package helloHibernate;
import java.io.Serializable;
import java.util.List;
import javax.persistence.GeneratedValue;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
public class TestMain {
private static SessionFactory sessionFactory; // 멤버변수 만들기
public static void main(String[] args) {
/*
* 이렇게 3줄은 아래 한 줄과 같다.chained method방법 Configuration conf = new Configuration();
* //conf 객체 만들고 conf.configure("hibernate.cfg.xml"); // 설정파일 명시 디폴트 name이라 생략은
* 가능 sessionFactory = conf.buildSessionFactory();
*/
// chained method
sessionFactory = new Configuration().configure().buildSessionFactory(); // sessionFactory 생성
//category 생성
Category category1 = new Category();
category1.setName("컴퓨터"); //id는 @GeneratedValue이므로 별도록 지정 안 함
Category category2 = new Category();
category2.setName("자동차"); //id는 @GeneratedValue이므로 별도록 지정 안 함
//product 생성
Product product1 = new Product(); // product 객체 생성
product1.setName("Notebook1");
product1.setPrice(2000);
product1.setDescription("Awesome notebook!!");
product1.setCategory(category1); //product에서 category로 uni-direction 연결 생성
Product product2 = new Product(); // product 객체 생성
product2.setName("Notebook2");
product2.setPrice(3000);
product2.setDescription("Power notebook!!");
product2.setCategory(category1); //product에서 category로 uni-direction 연결 생성
Product product3 = new Product(); // product 객체 생성
product3.setName("Sonata");
product3.setPrice(100000);
product3.setDescription("Popular Car!!");
product3.setCategory(category2); //product에서 category로 uni-direction 연결 생성
Session session = sessionFactory.openSession(); // session 생성
Transaction tx = session.beginTransaction(); // 트랜젝션 수행
// 개별적으로
// Serializable id1= session.save(product1); //product1 저장 따라서 자동적으로 DB에 저장됨 ,
// id1에 id값 저장하기
// list로 출력 시 아이디 저장 필요 없음
session.save(product1); //cascade=All 해놨으므로 product 저장 시 category도 같이 저장됨
session.save(product2);
session.save(product3);
session.delete(product3);// product3 삭제 시 category2도 삭제됨 (product3 -> category2 이므로)
product1.setCategory(null); //product1이 category 지정 안 하도록 사전에 null로 설정
session.delete(product1); //product1과 product2 모두 category1 가리킴 따라서 사전에 product1 -> category1의 연결을 지워야함
/*
* session methods 사용하기 Product savedProduct = session.get(Product.class, id1);
* //get() System.out.println("saved product" + savedProduct);
*/
// createQuery() 사용하기 -리스트 조회
/*
* Query<Product> aQuery = session.createNamedQuery("form Product",
* Product.class); // HQL 사용 "form Product order by name"으로 할 시 순서 맞춰서 나옴
* (book2, book1으로 저장하여도 출력은 book1 book2 순서로) List<Product> products =
* aQuery.getResultList(); // 조회 System.out.println(products);// 출력
*/
tx.commit();
session.close(); // session 닫기
sessionFactory.close(); // sessionFactory 닫기
}
}