개발관련/Spring
2015. 12. 4. 17:22
이번엔 복합키에 대해 알아보자.
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 | package com.zest.hibernate.chapter4; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Accounts { private int userId; private int accountId; // @Id // //만약 변수에 annotaion을 할꺼면 private는 안된다. 다른 객체이므로. getxxx 에 annotaion을 붙이면 된다. // CompoundKey compoundKey; private int accountBalance; // public CompoundKey getCompoundKey() { // return compoundKey; // } // public void setCompoundKey(CompoundKey compoundKey) { // this.compoundKey = compoundKey; // } public int getAccountBalance() { return accountBalance; } public void setAccountBalance(int accountBalance) { this.accountBalance = accountBalance; } } | cs |
userId와 accountId에 복합키를 걸면 어떻게 할까?
자 새로운 객체를 한개더 생성하자. 클래스 이름은 CompundKey이다.
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.chapter4; import java.io.Serializable; import javax.persistence.Embeddable; //필히 Serializable 해줘야함. @Embeddable public class CompoundKey implements Serializable{ private int userId; private int accountId; public CompoundKey(int userId, int accountId){ this.accountId = accountId; this.userId = userId; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public int getAccountId() { return accountId; } public void setAccountId(int accountId) { this.accountId = accountId; } } | cs |
여기서도 @Embeddable 이라는 어노테이션을 사용한다. 중요한 점은 필히
Serializable을 해야하는 점이다. 그리고 Accounts 클래스를 수정하자.
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.chapter4; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Accounts { //compound key로 옮겼으니 주석으로 막는다. // private int userId; // private int accountId; @Id //만약 변수에 annotaion을 할꺼면 private는 안된다. 다른 객체이므로. getxxx 에 annotaion을 붙이면 된다. CompoundKey compoundKey; private int accountBalance; public CompoundKey getCompoundKey() { return compoundKey; } public void setCompoundKey(CompoundKey compoundKey) { this.compoundKey = compoundKey; } public int getAccountBalance() { return accountBalance; } public void setAccountBalance(int accountBalance) { this.accountBalance = accountBalance; } } | cs |
CompoundKey라는 객체에 @Id 붙여 기본키를 만들었다. 다른 예제와 틀리게 private가 없을 것이다. 외부에 있는 변수를 끌어와서 private를 쓰면 에러가 난다. 이때 getxxx의 함수에 @Id를 붙이거나 또는 private 이상의 권한을 줘야만 된다.
그럼 테스트 코드로...
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 | package com.zest.hibernate.chapter4; 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 AccountTest { @Test public void account1() { AnnotationConfiguration config = new AnnotationConfiguration(); config.addAnnotatedClass(Accounts.class); config.configure("hibernate.cfg.xml"); new SchemaExport(config).create(true, true); // 아래 두개의 구문은 객체를 트랜잭션을 컨트롤. SessionFactory factory = config.buildSessionFactory(); Session session = factory.getCurrentSession(); session.beginTransaction(); CompoundKey key1 = new CompoundKey(100, 10001); Accounts savings = new Accounts(); savings.setCompoundKey(key1); savings.setAccountBalance(8500); CompoundKey key2 = new CompoundKey(100, 20001); Accounts checking = new Accounts(); checking.setCompoundKey(key2); checking.setAccountBalance(2500); session.save(savings); session.save(checking); session.getTransaction().commit(); } } | cs |
index를 확인하면 userid와 accountid가 복합키로 생성되있을 것이다.