hibernate 多对多配置

标签 hibernate many-to-many

我在下面列出了一些复杂的结构。基本上我有一堆不同的“角色组”。每个角色组包含一组角色。一个用户可能有多个不同的角色组,一个角色组可以应用于许多不同的用户。因此,我采用了多对多关系。

我希望 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", joinColumns=@JoinColumn(name="ROLE_GROUP_ID"))
   @AttributeOverrides({
   @AttributeOverride(name="role", column=@Column(name="ROLE")) })
   private Set<Role> roles = new HashSet<Role>();
}


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

最佳答案

看起来您的 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);

也让你的角色成为一张 table :
@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。

关于 hibernate 多对多配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10144716/

相关文章:

java - hibernate validator 的问题 - javax.persistence.RollbackException (spring)

laravel - 从数据透视表 laravel 中删除一个条目

many-to-many - rails_admin has_many 通过额外的字段

java - 当存储过程中有大部分逻辑时,我应该使用 JDBC 还是 Hibernate?

java - java 文件中的 hibernate.cfg.xml 替代方案

java - hibernate乐观锁机制

Spring-Hibernate-MySQL 应用程序中的 javax.el.PropertyNotFoundException : Property not found on type java. lang.String

python - 在 django 中按 ManyToMany 关系列出标签

json - JSON 中的多对多关系

hibernate - 为什么 hibernate 在映射多对多关系时会生成额外的实体?