2017-02-01 2 views
4

Zuerst dachte ich, this solution mein Problem lösen könnte:ManyToManyToMany - Joining drei Tabellen mit Hibernate Annotations

@Entity 
public class User { 

    @JoinTable(name = "user_permission", 
     joinColumns = @JoinColumn(name = "user_id"), 
     inverseJoinColumns = @JoinColumn(name = "permission_id")) 
    @MapKeyJoinColumn(name = "project_id") 
    @ElementCollection 
    private Map<Project, Permission> permissions = new HashMap<>(); 

} 

@Entity 
public class Project { 
    ... 
} 

@Entity 
public class Permission { 
    ... 
} 

Aber in dieser Implementierung kann es nur einen Permission Satz sein pro Project. Ich mag die Fähigkeit erreichen, mehrere Berechtigungen für ein Projekt so einzustellen, dass die folgenden Bedingungen erfüllt sein:

| user_id | project_id | permission_id | 
|---------|------------|---------------| 
| 1  | 1   | 1    | 
|---------|------------|---------------| 
| 1  | 1   | 2    | 
|---------|------------|---------------| 
| 1  | 2   | 1    | 
|---------|------------|---------------| 
| 1  | 2   | 2    | 
|---------|------------|---------------| 
| 2  | 1   | 1    | 
|---------|------------|---------------| 
| 2  | 1   | 2    | 
|---------|------------|---------------| 
| 2  | 2   | 1    | 
|---------|------------|---------------| 
| 2  | 2   | 2    | 
+0

Wenn der Schlüssel/Wert einer Karte sind Einheiten, dann ist das keine ElementCollection; es benötigt ManyToMany gemäß der JPA-Spezifikation –

Antwort

2

Sie eine Einheit auf Ihre Beziehungstabelle gewidmet verwenden kann. So erklären wir zum Beispiel Beziehungen zu ihren eigenen Attributen.
Dies ist in der folgenden Umsetzung führen würde:

@Entity 
@IdClass(PermissionAssignation.class) 
public class PermissionAssignation { 

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

    @Id 
    @ManyToOne 
    @JoinColumn(name="project_id") 
    private Project project; 

    @Id 
    @ManyToOne 
    @JoinColumn(name="permission_id") 
    private Permission permission; 
    ... 
} 

ich die Lösung in diesem Beitrag nicht gefunden verwendet: Hibernate and no PK

Es wird erläutert, wie die PK mit dem Feld erstellen (ich es nicht getestet). Wenn es nicht funktioniert, verwenden Sie besser eine EmbeddedId Klasse.

Und wenn Sie Ihre Beziehung wollen bidirektional sein, können Sie dann eine Set<PermissionAssignation> (oder List, wie Sie es vorziehen/müssen) verwenden:

@Entity 
public class User { 

     @OneToMany(mappedBy="user") 
     private Set<PermissionAssignation> permissions; 

} 
+0

Dies funktionierte perfekt. Ich fügte nur eine Liste von Projekten hinzu, die dem Benutzer helfen sollen, durch die Berechtigungen zu navigieren. Wenn das Projekt in der Liste enthalten ist, kann der Benutzer das Projekt "anzeigen", und die Berechtigungen ermöglichen es ihm, verschiedene Aktionen für das Projekt auszuführen. – Rawr