개발관련/Spring
2015. 12. 4. 14:29
하나의 객체에 두개의 테이블 생성하기 를 해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | package com.zest.hibernate.chapter2; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.SecondaryTable; import javax.persistence.Table; @Entity @Table(name="Customer") @SecondaryTable(name="CustomerDetail") public class Customer { @Id @GeneratedValue private int customerId; private String customerName; @Column(table="CustomerDetail") private String customerAddress; @Column(table="CustomerDetail") private int creditScore; @Column(table="CustomerDetail") private int rewardPoints; public int getCustomerId() { return customerId; } public void setCustomerId(int customerId) { this.customerId = customerId; } public String getCustomerName() { return customerName; } public void setCustomerName(String customerName) { this.customerName = customerName; } public String getCustomerAddress() { return customerAddress; } public void setCustomerAddress(String customerAddress) { this.customerAddress = customerAddress; } public int getCreditScore() { return creditScore; } public void setCreditScore(int creditScore) { this.creditScore = creditScore; } public int getRewardPoints() { return rewardPoints; } public void setRewardPoints(int rewardPoints) { this.rewardPoints = rewardPoints; } } | cs |
처음 보는 어노테이션이 등장한다. @SecondaryTable 이라는 넘이다. 기존 customer 말고 cumstomerDetail 이라는 테이블로 선언이 되었다. 이 객체의 재미난 점은 기본키는 둘다 같은 column을 사용한다는 것이다. 그리고 detail의 경우 cumstomerId를 기본키로 하면서 외래키를 가진다. 그리고 sencondaryTable에 추가할 컬럼은 @Column 어노테이션을 사용하여 추가한다.
아마도 1:1 대응 구조에 사용하면 좋을듯 보인다. 그럼 테스트 코드를 보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | package com.zest.hibernate.chapter2; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.junit.Test; public class CustomerTest { @Test public void customer1() { AnnotationConfiguration config = new AnnotationConfiguration(); config.addAnnotatedClass(Customer.class); config.configure("hibernate.cfg.xml"); new SchemaExport(config).create(true, true); // 아래 두개의 구문은 객체를 트랜잭션을 컨트롤. SessionFactory factory = config.buildSessionFactory(); Session session = factory.getCurrentSession(); session.beginTransaction(); Customer alex = new Customer(); alex.setCustomerName("Alex Rod"); alex.setCustomerAddress("101 washington"); alex.setCreditScore(780); alex.setRewardPoints(12000); session.save(alex); session.getTransaction().commit(); } } | cs |
사용법은 앞서 보여준 방법과 동일한데 결과 로그는 두개의 테이블에 넣는다.
1 2 3 | Hibernate: insert into TESTSCHEMA.Customer (customerName, customerId) values (?, ?) Hibernate: insert into TESTSCHEMA.CustomerDetail (creditScore, customerAddress, rewardPoints, customerId) values (?, ?, ?, ?) | cs |