Comment créer une table de jointure avec des annotations JPA?

J'ai besoin de créer une table de jointure dans ma base de données en utilisant JPA annotations de sorte que le résultat sera le suivant:

entrez la description de l'image ici

Jusqu'à présent, je viens d'implémenter 2 entités:

@Entity
@Table(name="USERS", schema="ADMIN")
public class User implements Serializable {

    private static final long serialVersionUID = -1244856316278032177L;
    @Id 
    @Column(nullable = false)
    private String userid;  

    @Column(nullable = false)
    private String password;

    public String getUserid() {
        return userid;
    }

    public void setUserid(String userid) {
        this.userid = userid;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

@Entity
@Table(name="GROUPS", schema="ADMIN")
public class Group implements Serializable {

    private static final long serialVersionUID = -7274308564659753174L;
    @Id
    @Column(nullable = false)
    private String groupid;

    public String getGroupid() {
        return groupid;
    }
    public void setGroupid(String groupid) {
        this.groupid = groupid;
    }
}

Devrais-je créer une autre entité appelée USER_GROUP ou je peux simplement ajouter des annotations, de sorte que la table de jointure sera créée automatiquement lorsque j'exécuterai create tables from entities (ORM)?

Comment dois-je annoter mes entités pour obtenir la même chose que dans l'image?

26
demandé sur slal 2011-11-02 15:13:16

4 réponses

Vous ne devriez certainement pas créer l'entité User_Group car c'est plus la représentation de base de données sous-jacente que celle orientée objet.

Vous pouvez obtenir la table de jointure en définissant quelque chose comme:

@Entity
@Table(name="USERS", schema="ADMIN")
public class User implements Serializable {
//...

@ManyToOne
@JoinTable(name="USER_GROUP")
Group group;

@Entity
@Table(name="GROUPS", schema="ADMIN")
public class Group implements Serializable {
//...

@OneToMany(mappedBy="group")
Set<User> users;

Edit: Si vous souhaitez définir explicitement les noms des colonnes vous pouvez utiliser les annotations @JoinColumn éléments comme indiqué ci-dessous:

@ManyToOne
@JoinTable(name="USER_GROUP",
    joinColumns = @JoinColumn(name = "userid", 
                              referencedColumnName = "userid"), 
    inverseJoinColumns = @JoinColumn(name = "groupid", 
                              referencedColumnName = "groupid"))
Group group;
32
répondu Piotr Nowicki 2014-12-19 13:55:20

Je l'implémenterais de cette façon:

@Entity
@Table(name="GROUPS", schema="ADMIN")
public class Group implements Serializable {
  @OneToMany
  @JoinTable(name = "USER_GROUP",
            joinColumns = @JoinColumn(name = "groupid"),
            inverseJoinColumns = @JoinColumn(name = "userid"))
  private List<User> users;
}

La Solution suggérée par @ PedroKowalski devrait aussi fonctionner, mais vous devrez alors conserver une référence à Group entity dans votre User entity ce qui n'est pas toujours possible.

6
répondu jFrenetic 2011-11-02 12:11:42

Pour avoir les mêmes annotations comme dans votre diagramme, vous pouvez le faire dans votre User classe:

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "USER_GROUP", 
           joinColumns = { @JoinColumn(name = "userid") }, 
           inverseJoinColumns = { @JoinColumn(name = "groupid") })
private List<Group> grups;

Dans votre classe de groupe

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "USER_GROUP", 
           joinColumns = { @JoinColumn(name = "groupid") }, 
           inverseJoinColumns = { @JoinColumn(name = "userid") })
private List<User> users;
6
répondu user902383 2016-08-26 12:41:22

Je me demande Quel est le point de créer une table de jointure de cette façon, étant donné que nous ne pouvons pas accéder directement aux requêtes? JPA ne permet pas de faire des requêtes directement à la Table de jointure, donc si l'utilisateur veut faire une opération sur USER_GROUP, il doit créer une requête de jointure normale entre users et Groupes; pour cette raison, la table de jointure USER_GROUP est inutile.

1
répondu Angel 2016-08-18 07:12:38