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
}
你是否在'Role'中覆盖'equals'和'hashCode'? – axtavt 2012-04-13 17:09:44
是的,两者都被覆盖。 – Craig 2012-04-13 17:20:46
我也应该指出,这是最初被列为OneToMany关系,并且当只有一个用户引用数据库中的RoleGroup时,所有工作都很好。但是,当我添加更多的RoleGroups引用时,我得到了一个唯一的约束违规,然后切换到ManyToMany,留下当前我在这里发布的问题。 – Craig 2012-04-13 17:26:07