일전에 OneToMany Uni-direction의 코드에서 Category에서의 Product로 향한 연결을 추가한다.
@OneToMany(mappedBy ="category", cascade=CascadeType.ALL, fetch=FetchType.LAZY) //LAZY이므로 category 읽을 때 product까지 읽지 않음
private Set<Product> products = new HashSet<Product>(); //양방향 설정
-> ManyToOne 속성 지워주기
@ManyToOne //bi-direction 경우 Category가 주가 되므로 product의 manytoone의 속성은 지워준다.
@JoinColumn(name="category_id")
private Category category; //외래키로 사용
-> 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 닫기
}
}