wake-up-neo.com

Wie erstelle ich eine Join-Tabelle mit JPA-Anmerkungen?

Ich muss in der Datenbank eine Join-Tabelle mit JPA-Anmerkungen erstellen, damit das Ergebnis wie folgt lautet:

enter image description here

Bisher habe ich nur 2 Entitäten implementiert:

@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;
    }
}

Soll ich eine weitere Entität mit dem Namen USER_GROUP erstellen, oder ich kann einfach einige Anmerkungen hinzufügen, sodass die Join-Tabelle automatisch erstellt wird, wenn ich Create Tables from Entities (ORM) ausführe?

Wie soll ich meine Entitäten kommentieren, um das gleiche wie im Bild zu erreichen?

27
sfrj

Sie sollten definitiv keine User_Group-Entität erstellen, da diese eher die zugrunde liegende Datenbankrepräsentation als die objektorientierte ist.

Sie können die Join-Tabelle erreichen, indem Sie Folgendes definieren:

@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: Wenn Sie die Namen der Spalten explizit festlegen möchten, können Sie @JoinColumn-Elemente wie folgt verwenden:

@ManyToOne
@JoinTable(name="USER_GROUP",
    joinColumns = @JoinColumn(name = "userid", 
                              referencedColumnName = "userid"), 
    inverseJoinColumns = @JoinColumn(name = "groupid", 
                              referencedColumnName = "groupid"))
Group group;
35
Piotr Nowicki

Ich würde es so umsetzen: 

@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;
}

Die von @PedroKowalski vorgeschlagene Lösung sollte ebenfalls funktionieren, aber Sie müssen einen Verweis auf Group entity in Ihrem User entity beibehalten, was nicht immer möglich ist.

6
jFrenetic

Um die gleichen Anmerkungen wie in Ihrem Diagramm zu haben, können Sie dies in Ihrer User-Klasse tun:

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

in deiner gruppenklasse

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

Ich frage mich, warum es so ist, eine Join-Tabelle auf diese Weise zu erstellen, da wir nicht direkt auf Abfragen zugreifen können. JPA erlaubt keine Abfragen direkt an der Join-Tabelle, also wenn der Benutzer möchte Um eine Operation in USER_GROUP auszuführen, muss er eine normale Join-Abfrage zwischen users und groups erstellen. Aus diesem Grund ist die Join-Tabelle USER_GROUP unbrauchbar.

1
Angel