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