2

manytomany で生成されたテーブルに追加の列が必要です

互いに多対多に関連する 2 つのエンティティがあります (ユーザー ManytoMany グループ)

@Entity
public class User {
    //other fields
    private Set<Group> groups = new HashSet<Group>(0);
}

@Entity
public class Group {
    //other fields
    private Set<User> users = new HashSet<User>(0);
}

したがって、ここではデータベースに3つのテーブルを次のように生成します

table1 - ユーザー

table2 - グループ

table3 - ユーザーグループ

UserGroup テーブルに追加のフィールドが必要なのですが、どのエンティティでそれを指定するのですか?

追加フィールドは

プライベート ブール isThisUserIsGroupManager;

そのため、このグループのユーザーがグループマネージャーでもあることを取得できます。

4

3 に答える 3

6

リレーションシップには設定する永続的な属性はなく、エンティティのみに設定されます。そのため、間に3番目のエンティティが必要です。アイデンティティはとから派生するため、2つの@Id属性があり、その結果として必要になります。@IdClassGroupUser

@Entity
public class User {
    @Id int id;    
    @OneToMany(mappedBy = "user")
    private Set<GroupMemberShip> groupMemberShips;
    ...
}

@Entity
public class Group {
    @Id int id;
    @OneToMany(mappedBy = "group")
    private Set<GroupMemberShip> groupMemberShips;
    ...
}


@Entity
@IdClass(GroupMemberShipId.class)
public class GroupMemberShip {
    @Id @ManyToOne User user;

    @Id @ManyToOne Group group;

    private boolean isThisUserIsGroupManager;
    ...
}

public class GroupMemberShipId implements Serializable {
    int user;
    int group;
    ...
}
于 2012-08-09T12:07:39.647 に答える
1

実際には、追加の列を含めて、多対多の関連付けを行うことができます。

まず、多対多マッピングは Hibernate の機能です。Hibernate (3.5.1-final) リファレンスの第 1 章の「関連付けのマッピング」セクションで見つけることができます。「多対多」を検索してください (私が持っている PDF ファイルのセクション「1.2. 2.一方向のセットベースの関連付け」が探しているものです.14ページと14ページにあなたのような例があります. したがって、前述の例にも 3 つのテーブルがあるため、他のレスポンダーが 2 つの多対 1 マッピングを使用する必要があると言ったときに、私は混乱するかもしれません。

次に、追加の列の使用例については、Mkyong.comのこのチュートリアルを参照してください。

心に留めておくべきこと、およびチュートリアルで明示されていないことは、通常、関連付け情報を格納するテーブルには余分な列がなく、暗黙的に主キーが参加エンティティのキ​​ーの複合になることです: UserGroup のキーuser.id と group.id を結合します。したがって、キーを構成するフィールドを指定するには @AssociationOverride タグが必要です。そうしないと、Hibernate はすべてのフィールドを次のように使用します。

それが良い習慣であるかどうかは別の問題であり、唯一の目的が保持することを目的とする別のエンティティ(たとえば、あなたの場合は4番目のUserGroupInfo)を持つ場合と比較してパフォーマンスが向上するかどうかです。追加の列 (UserGroupInfo は UserGroup の ID を再利用する必要があります)。

于 2013-09-05T10:04:45.283 に答える
0

Hibernateで直接それを行うことはできません。

多くのマッピングを行う必要があります-1つそして1つ-多くのマッピング。

マッピングテーブルに追加の列が必要です。それに何らかの値を設定することになると思います。そのテーブルにエンティティをマップせずにそれを行うことはできません。

于 2012-08-09T10:24:56.523 に答える