4

これがいつから可能になるかはわかりませんが、私はいつも望んでいた方法で複合キーを作成しました:いいえ@EmbeddedId、必要ありません@IdClass!!

  • 春 4.0.0.M3
  • 休止状態 4.3.0.Beta4
  • JPA2.1

ユーザー.java :

@Entity
public class User {
    @Id
    ...

    @OneToMany(mappedBy="user", cascade=CascadeType.ALL, orphanRemoval=true)
    private List<GroupUser> groupUsers;     
}

Group.java :

@Entity
public class Group {
    @Id
    ...

    @OneToMany(mappedBy="user", cascade=CascadeType.ALL, orphanRemoval=true)
    private List<GroupUser> groupUsers;     
}

GroupUser.java :

@Entity
public class GroupUser implements Serializable {
    @Id
    @ManyToOne
    @JoinColumn(name="Group_id")
    private Group group;

    @Id
    @ManyToOne
    @JoinColumn(name="User_id")
    private User user;

    @Id
    @Column
    private String s;

    @Column
    private int i;
}

そして、これがMySQLの言うことです:

 USER             GROUP_USER            GROUP
------    -------------------------    -------
 id        User_id  (PK, NOT NULL)       id 
           Group_id (PK, NOT NULL)
           s        (PK, NOT NULL)
           i        (DEFAULT NULL)

GROUP_USER詳細:

  • 主キー: User_id、Group_id、s
  • INDEX #1 / 外部キー: User_id
  • INDEX #2 / 外部キー: Group_id

次のような他のテストも行いました。

@Entity
public class A implements Serializable {

    @Id
    @Column
    String a;

    @Id
    @Column
    String b;

    @Column
    String c;

}

魅力のように動作します!!


またはを使用する理由はまだあります@EmbeddedId@IdClass?

And: これは JPA 2.1 の一部ですか、それとも Hibernate 機能ですか?

4

1 に答える 1

2

JPA では、複合主キーに対して何らかの主キー クラスを定義する必要があります。ただし、実際には、これは pk クラス インスタンスを必要とする EntityManager の find および getReference 呼び出しで主に必要になるようです。実装には、これらの呼び出しに使用できる独自の pk 表現がある場合がありますが、移植性はありません。

于 2013-09-25T16:29:40.100 に答える