Web Framework) Hibernate OneToMany-Uni-direction 실습

Jay Kim·2022년 1월 17일
0

Web Framework

목록 보기
2/10

one to many mapping using joincolumn

*code는 [Web Framework2] Week2- Hibernate 실습 코드의 연장입니다.

1)Uni-directionald인 경우

  1. helloHibernate 패키지 안에 Category.java 클래스 생성하기
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&amp;characterEncoding=UTF-8&amp;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 닫기

	}

}

0개의 댓글