4

以下にリストした少し複雑な構造があります。基本的に、私はさまざまな「役割グループ」をたくさん持っています。各役割グループには、役割のグループが含まれています。ユーザーは潜在的に複数の異なる役割グループを持つことができ、役割グループは多くの異なるユーザーに適用できます。そのため、私は ManyToMany 関係に行きました。

以下に示すように、RoleGroup をユーザーの一部にしたいと考えています。

すべてがある程度機能しています。ただし、以下に示す挿入ステートメントを使用すると、コードにバグがあります。RoleGroup には ROLE3 のみが含まれます。理由はわかりませんが、どういうわけか私のコードでは、現在のセットアップで RoleGroup の一部として 1 つの Role しか許可されていません。データベースにクエリを実行すると、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
}
4

1 に答える 1

1

joinColumn が間違っているようです。通常、ManyToMany Join には joinColumns と inverseJoinColumns の 2 つの列がありますが、間違った列を使用していると言わざるを得ません。

グループにロールを含めるには、別のマッピング テーブルが必要になると思います。これを 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;
}

ゲッター/セッターを忘れないでください。

于 2012-04-13T19:02:44.000 に答える