2012-04-13 189 views
4

我有一點複雜的結構,我已經列在下面。基本上我有一堆不同的「角色組」。每個角色組都包含一組角色。用戶可能有多個不同的角色組,角色組可以應用於許多不同的用戶。正因爲如此,我與ManyToMany建立了良好關係。休眠ManyToMany配置

我想讓RoleGroup成爲用戶的一部分,如下所列。

一切都有點工作。但是,當我使用下面列出的插入語句時,我的代碼中有一個錯誤。 RoleGroup只包含ROLE3。我不知道爲什麼,但不知何故,我的代碼只允許一個角色成爲RoleGroup的一部分,並使用當前設置。查詢數據庫會得出所有3個角色都存在,但它們不在我的實體上。

請幫忙!

CREATE TABLE USER (
    USER_ID NUMBER(38, 0) PRIMARY KEY, 
    NAME  VARCHAR2(50) NOT NULL 
); 

CREATE TABLE ROLE_GROUPS (
    ROLE_GROUP_ID NUMBER(38, 0) PRIMARY KEY, 
    NAME   VARCHAR2(50) NOT NULL 
    -- constraints 
    CONSTRAINT UQ_ROLE_GROUP_NAME UNIQUE (NAME) 
); 

CREATE TABLE ROLE (
    ROLE_GROUP_ID NUMBER(38, 0) NOT NULL, 
    ROLE   VARCHAR2(10) NOT NULL, 
    -- constraints 
    CONSTRAINT PK_ROLES PRIMARY KEY (ROLE_GROUP_ID, ROLE), 
    CONSTRAINT FK_ROLES FOREIGN KEY(ROLE_GROUP_ID) REFERENCES ROLE_GROUPS 
); 

CREATE TABLE ROLE_GROUP_X_USER (
    ROLE_GROUP_ID NUMBER(38, 0) NOT NULL, 
    USER_ID   NUMBER(38, 0) NOT NULL, 

    -- constraints 
    CONSTRAINT PK_1 PRIMARY KEY (ROLE_GROUP_ID, USER_ID), 
    CONSTRAINT FK_1 FOREIGN KEY(ROLE_GROUP_ID) REFERENCES ROLE_GROUPS, 
    CONSTRAINT FK_1 FOREIGN KEY(USER_ID) REFERENCES USER 
); 

INSERT INTO ROLE_GROUPS(ROLE_GROUP_ID, NAME) VALUES (1, 'GROUP_1'); 
INSERT INTO ROLE(ROLE_GROUP_ID, NAME) VALUES(1 ,'ROLE1');  
INSERT INTO ROLE(ROLE_GROUP_ID, NAME) VALUES(1 ,'ROLE2');  
INSERT INTO ROLE(ROLE_GROUP_ID, NAME) VALUES(1 ,'ROLE3');  
INSERT INTO ROLE_GROUP_X_USER(USER_ID,ROLE_GROUP_ID) SELECT USER_ID, 1 FROM USER where USER_ID IN ('1', '2', '3', '4'); 

@Entity 
@Table(name="USER") 
public class User { 
    //Other code 

    @ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinTable(name = "ROLE_GROUP_X_USER", 
    joinColumns = { @JoinColumn(name = "USER_ID") }, 
    inverseJoinColumns = { @JoinColumn(name = "ROLE_GROUP_ID") }) 
    private Set<RoleGroupEntity> roleGroupEntities; 
} 

@Entity 
@Table(name="ROLE_GROUPS") 
public class RoleGroupEntity { 
    //Other code 

    @ElementCollection(fetch=FetchType.EAGER) 
    @CollectionTable(name="ROLE", [email protected](name="ROLE_GROUP_ID")) 
    @AttributeOverrides({ 
    @AttributeOverride(name="role", [email protected](name="ROLE")) }) 
    private Set<Role> roles = new HashSet<Role>(); 
} 


@Embeddable 
public class Role { 
    private String role; 
    //Getter, Setter 
    //Hashcode, equals override 
} 
+0

你是否在'Role'中覆蓋'equals'和'hashCode'? – axtavt 2012-04-13 17:09:44

+0

是的,兩者都被覆蓋。 – Craig 2012-04-13 17:20:46

+0

我也應該指出,這是最初被列爲OneToMany關係,並且當只有一個用戶引用數據庫中的RoleGroup時,所有工作都很好。但是,當我添加更多的RoleGroups引用時,我得到了一個唯一的約束違規,然後切換到ManyToMany,留下當前我在這裏發佈的問題。 – Craig 2012-04-13 17:26:07

回答

1

看起來你的joinColumn是錯誤的。通常你在ManyToMany Join,joinColumns和inverseJoinColumns上有兩列,但我不得不說你使用了錯誤的列。

我想你將需要一個單獨的映射表來包含組中的角色。添加到您的RolesGroup類:

@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "GROUP_ROLE_MAP_T", joinColumns = { 
     @JoinColumn(name = "ROLE_GROUP_ID") 
}, inverseJoinColumns = { 
     @JoinColumn(name = "ROLE_ID") 
}) 
private Set<Role> role = new HashSet<Role>(0); 

讓你的角色的表太:

@Entity 
@Table(name = "ROLES_T") 
@AttributeOverride(name = "id", column = @Column(name = "ROLE_ID")) 
public class Role { 
    @Column(name = "ROLE_ID", nullable = true) 
    private Long roleId = new Long(0); 

    @Column(name = "ROLE_NAME", nullable = false) 
    private String role; 
} 

不要忘記你的getter/setter方法。