개발관련/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(truetrue);
 
        // 아래 두개의 구문은 객체를 트랜잭션을 컨트롤.
        SessionFactory factory = config.buildSessionFactory();
        Session session = factory.getCurrentSession();
 
        session.beginTransaction();
 
        CompoundKey key1 = new CompoundKey(10010001);
        Accounts savings = new Accounts();
        savings.setCompoundKey(key1);
        savings.setAccountBalance(8500);
        
        
        CompoundKey key2 = new CompoundKey(10020001);
        Accounts checking = new Accounts();
        checking.setCompoundKey(key2);
        checking.setAccountBalance(2500);
        
        
        session.save(savings);
        session.save(checking);
        session.getTransaction().commit();
    }
}
 
 
 
cs


index를 확인하면 userid와 accountid가 복합키로 생성되있을 것이다. 

posted by 제스트
: