Web Framework) Hibernate OneToMany-bi-direction

Jay Kim·2022년 1월 17일
0

Web Framework

목록 보기
3/10

일전에 OneToMany Uni-direction의 코드에서 Category에서의 Product로 향한 연결을 추가한다.

1.Category에서 OneToMany 연결

@OneToMany(mappedBy ="category", cascade=CascadeType.ALL, fetch=FetchType.LAZY)	//LAZY이므로 category 읽을 때 product까지 읽지 않음
private Set<Product> products = new HashSet<Product>();	//양방향 설정

2.Product.java 수정

-> ManyToOne 속성 지워주기

@ManyToOne	//bi-direction 경우 Category가 주가 되므로 product의 manytoone의 속성은 지워준다.
@JoinColumn(name="category_id")
private Category category;	//외래키로 사용

3.TestMain.java 수정

-> 1) product에 category1.getProducts().add(product1); //생성한 product를 category에 넣어주기 ->양방향으로 연결됨

-> 2) save 확인 : session.save(category1);//category 저장하면 product 자동 저장됨

-> 3) fetch 확인 : LAZY/ EAGER의 차이 알기

OneToMany의 경우 LAZY가 디폴트값

package helloHibernate;

import java.io.Serializable;
import java.util.List;
import java.util.Set;

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 연결 생성
		category1.getProducts().add(product1);	//생성한 product를 category에 넣어주기 ->양방향으로 연결됨

		Product product2 = new Product(); // product 객체 생성
		product2.setName("Notebook2");
		product2.setPrice(3000);
		product2.setDescription("Power notebook!!");
		product2.setCategory(category1);           //product에서 category로 uni-direction  연결 생성
		category1.getProducts().add(product2);	//생성한 product를 category에 넣어주기->양방향으로 연결됨
		
		Product product3 = new Product(); // product 객체 생성
		product3.setName("Sonata");
		product3.setPrice(100000);
		product3.setDescription("Popular Car!!");
		product3.setCategory(category2);           //product에서 category로 uni-direction 연결 생성
		category2.getProducts().add(product3);	//생성한 product를 category에 넣어주기->양방향으로 연결됨
		
		//session 1
		Session session = sessionFactory.openSession(); // session 생성
		Transaction tx = session.beginTransaction(); // 트랜젝션 수행
		
		Serializable cid = session.save(category1);	//카테고리 아이디

		// 개별적으로
		// Serializable id1= session.save(product1); //product1 저장 따라서 자동적으로 DB에 저장됨 ,
		// id1에 id값 저장하기
     
		session.save(category1);	//category 저장하면 product 자동 저장됨 
		session.save(category2);
		
		session.delete(category1);//category1 제거 시, product1과 product2 모두 같이 삭제됨
		
		tx.commit();

		session.close(); // session 닫기
		
		//session 2 -fetch 확인
		Session session2 = sessionFactory.openSession(); // session 생성
		Transaction tx2 = session2.beginTransaction(); // 트랜젝션 수행
		
		Category aCategory = session2.get(Category.class, cid);	//category 읽어들이기 (아직은 category만 읽음)-LAZY
		
		Set<Product> products = aCategory.getProducts();	//category에서 product 가져오기
		
		for(Product p: products)	//실제로 product 사용 시 product 읽음
			System.out.println(p.getName());
		
	
		tx2.commit();
		session2.close(); // session2
		
		sessionFactory.close(); // sessionFactory 닫기

	}

}

0개의 댓글