2011-03-10 1 views
5

좋은 문제가 있습니다. 나는 문맥을 재개 할 것이다.JPA 사용자 이름처럼 @OneToMany 관계에 대한 열에 고유 컨트리먼트를 추가하는 방법

나는 웹 사이트를 나타내는 클래스 : Site과 클래스 User을 가지고 있습니다.

사이트에는 여러 명의 사용자가있을 수 있습니다.

class Site { 

    private int site_ID; 

    @OneToMany // with a join table 
    private List<User> users; 
    // ... 
} 

class User { 

    private int user_ID; 

    private String name; 

    private String lastname; 

    private String username; 

    private String password; 

} 

모든 사이트에 동일한 사용자 이름을 허용하고 사이트별로 하나만 허용하려고합니다.

Site/User/username 
1 /1 /username1 
1 /2 /username2 
2 /3 /username1 

어떻게하면됩니까?

감사

답변

8

는 사용자가 사이트 참조를하자 어떤 고유 제한 조건을 정의 허용

@OneToMany(mappedBy="site") 
private List<User> users; 
+0

영업 이익은 그가 그의 OneToMany에 대한 조인 테이블을 사용하고 싶어했다. 더욱이, 비록 그가 외래 키를 원한다고하더라도, id는 이미 유일하기 때문에 당신의 유일한 제약은 유용하지 않습니다. (id/site가 항상있을 것이라는 것을 보장합니다.) –

+0

@JB Nizet : a) 확실히, 그는 조인 테이블이 맞다고 생각합니다. 할 일이지만, 나는 그것을 사용하지 않을 것을 제안합니다. (이 경우에 어떤 의미도없는 것처럼 보입니다) b) 그것은 내 오류였습니다. user_id가 아닌 username을 의미했습니다. (고정 된) –

+0

Thks, 나는 그것을 시도 할 것입니다. 오늘 밤. 그래서 그렇게하고 싶다면 내 User 객체에 Site에 대한 참조를 유지해야합니까? 처음에는 부모님이 모르는 사이에 아이들을 지키고 싶었습니다. 나는 나쁜 사람이라는 것을 알고 있습니다. –

1

확인 @UniqueConstraint.

@ManyToOne(optional=false) 
private Site site; 

지금 사용자에게 제약 조건을 추가합니다 : 또한 사이트 매핑을 변경해야합니다

@Table(uniqueConstraints = { 
    @UniqueConstraint(columnNames = { "username", "site" })) 
} @Entity 
public class User{ 
// etc 
} 

: 그것은

6

기본적으로 조인 테이블의 기본 인덱스는 고유하며 사이트를 기반으로합니다 사용자 FK 따라서 동일한 사이트를 복제 한 동일한 사용자를 보유 할 수 없습니다. 당신이 제약 조건을 강제 할 경우

는하지만 :

class Site { 

    private int site_ID; 

    @OneToMany // with a join table 
    @JoinTable(
     [email protected](columnNames={"Site_ID","users_ID"}) 
    ) 
    private List<User> users; 
    // ... 
} 
관련 문제