2013-10-08 4 views
0

스프링 보안을 구현하려고 시도했지만 역할과 사용자를 매핑 할 수 없습니다. 그래서 내가 "사용자", "역할"과 "user_role_connector"데이터베이스 테이블이 있습니다Hibernate 매핑이 작동하지 않습니다.

CREATE TABLE users (
    user_pk INT NOT NULL AUTO_INCREMENT, 
    ... 
PRIMARY KEY (user_pk)); 

CREATE TABLE roles (
    role_pk INT NOT NULL AUTO_INCREMENT, 
    role VARCHAR(20) NOT NULL UNIQUE, 
PRIMARY KEY (role_pk)); 

CREATE TABLE user_role_connector (
    urc_pk INT NOT NULL AUTO_INCREMENT, 
    user_fk INT NOT NULL, 
    role_fk INT NOT NULL, 
FOREIGN KEY (user_fk) REFERENCES users(user_pk), 
FOREIGN KEY (role_fk) REFERENCES roles(role_pk), 
PRIMARY KEY (urc_pk)); 

을 그리고 역할과 사용자에 대한 엔티티 클래스가 있습니다. 둘 다 매핑 할 때까지 작동합니다.

@Entity 
@Table(name = "users") 
public final class UserAccount { 

    private int user_pk; 
    ... 

    @OneToOne(cascade=CascadeType.ALL) 
    @JoinTable(name = "user_role_connector", 
     joinColumns  = {@JoinColumn(name = "user_fk", referencedColumnName = "user_pk")}, 
     inverseJoinColumns = {@JoinColumn(name = "role_fk", referencedColumnName = "role_pk")} 
    ) 
    private Role role; 

@Entity 
@Table(name = "roles") 
final public class Role { 

    private int role_pk; 
    private String role; 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinTable(name="user_role_connector", 
     joinColumns  = {@JoinColumn(name="role_fk", referencedColumnName="role_pk")}, 
     inverseJoinColumns = {@JoinColumn(name="user_fk", referencedColumnName="user_pk")} 
    ) 
    private Set<UserAccount> userRoles; 

왜 매핑되지 않습니까? 오류는 알파벳순으로 첫 번째 컨트롤러에서 오류를 만드는 빈이므로 잘못된 매핑이어야합니다.

거기에 좋은 스프링 보안 튜토리얼이 있습니까?

편집 : "role"필드가 userAccount이고 userRoles가 role에 추가 될 때까지 클래스가 작동한다고 쓰는 것을 잊어 버렸습니다. 오류가있는 코드 만 여기에 표시됩니다. 나쁜 영어를 구하기.

답변

1

저는 UserAccount 클래스와 Role 클래스 사이에 모순이 있다고 생각합니다. UserAccount는 user_role_connector 테이블을 OneToOne로 설명하지만 Role은 OneToMany와 동일한 관계를 설명합니다.

+0

예, 우리는 실제로 일대일 연관성을 위해 "join table"이라는 연관성을 기대하지 않습니다. "User.Roles"는 실제로 복수형이어야합니다. 이것은 오류의 원인 일 수 있습니다. –

+0

조인 테이블을 사용하여 OneToOne을 수행하는 경우는 드뭅니다. 예를 들어 [here] (http://en.wikibooks.org/wiki/Java_Persistence/OneToOne#Example_of_a_OneToOne_using_a_JoinTable_database)를 참조하십시오. 하지만 여기서는 그렇지 않습니다. UserAcount가 ManyToOne이거나 Role OneToOne이어야합니다. – Simon

+1

잘못된 주석 배치가되는 오류 원인을 발견했습니다. 이것은 또한 깨졌지만 나중에 나올 것입니다. Atm 계속 오류는 다른 주제에 있습니다. 도와 줘서 고마워! – user1335163

1

주석 배치로 인해 오류가 발생했습니다. 여기에서는 다른 방법을 사용하는 동안 필드에서 사용했습니다. 하나의 규칙을 따라야합니다! 다시 한번 더 똑똑해! :)

관련 문제