2012-04-04 1 views
1

Same question here, but it didn't help meJPA ManyToMany für Benutzer und Gruppen?

DB: users-table, groups and group_has_user

Ich habe drei Tabellen und viele, viele Verbindungen. In meiner JSF-Anwendung versuche ich Benutzer hinzuzufügen. In meiner Gruppentabelle gibt es drei verschiedene Gruppen: Admin, Kunde und Benutzer.

Was ich getan habe:

  1. Nachdem die Daten zu JSF-Formular Benutzer klickt speichern einfügen.
  2. ManagedBean usersController ruft die Gruppe (Kundengruppe) aus groupsController
  3. usersController ManagedBean erstellt den neuen Benutzer und speichert ihn in der mySQL-db.
  4. Problem ist, dass groups_has_user-Tabelle

leer ist und der Code

Benutzer:

public class Users implements Serializable { 
@ManyToMany(mappedBy = "usersCollection") 
private Collection<Groups> groupsCollection; 

Gruppen:

public class Groups implements Serializable { 
    @JoinTable(name = "groups_has_user", joinColumns = { 
     @JoinColumn(name = "groups_group_id", referencedColumnName = "group_id", nullable = false)}, inverseJoinColumns = { 
     @JoinColumn(name = "user_username", referencedColumnName = "username", nullable = false)}) 
    @ManyToMany 
    private Collection<Users> usersCollection; 

Userscontroller-managedBean

// current is type Users 
current.setIsCustomer(Boolean.TRUE); 

//BalusC!! Why this is not working but the one below is? 
//FacesContext facesContext = FacesContext.getCurrentInstance(); 
//HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false); 
//GroupsController groupsC = (GroupsController)session.getAttribute("groupsController"); 

FacesContext context = FacesContext.getCurrentInstance(); 
GroupsController groupsC = (GroupsController) context.getApplication().evaluateExpressionGet(context, "#{groupsController}", GroupsController.class); 

// Fetching group number 2, customer 
Groups customerGroup = groupsC.getGroupByGroupId(new Integer(2)); 
List<Users> usersCollection = (List<Users>) customerGroup.getUsersCollection(); 
usersCollection.add(current); 
//List<Groups> groupList = groupsC.getAllGroups(); 
customerGroup.setUsersCollection(usersCollection); 
// Updating the group using GroupsController 
groupsC.updateGroup(customerGroup); 

//groupList.add(customerGroup); 
//current.setGroupsCollection(groupList); 
getFacade().create(current); 

Nur Art und Weise, wie ich etwas bekam Tisch beitreten (groups_has_user) ist Gruppe zur gleichen Zeit auf Gruppen-Tabelle hinzufügen, aber dann gibt es eine eigene Linie für jeden Benutzer, und ich denke, dass es nicht der Zweck ist . Viele haben das gefragt, aber ich konnte das nicht herausfinden, selbst wenn ich diese lese.

Danke und Entschuldigung! Sami

Antwort

1

Ich habe es funktioniert. Mein Code war unordentlich und ich bereinigte ihn und es half. Ich bin nicht so sicher, warum das Aktualisieren der Gruppen-Tabelle einen neuen Benutzer in Benutzer-Tabelle einfügt, aber es ist in Ordnung für mich. Zuerst habe ich groups-table aktualisiert und user in users-table eingefügt und ich habe immer eine Ausnahme bekommen, dass es den pk bereits gibt (benutzername ist der pk). Es hat also zwei Inserts zum User-Table gemacht, aber jetzt funktioniert es perfekt. Keine Zeilen mehr zur Gruppen-Tabelle, nur zur gemeinsamen Tabelle und Benutzer-Tabelle.

// Add current new user to the customer-group 
      usersCollection.add(currentUser); 
      customerGroup.setUsersCollection(usersCollection); 

      // Updating the group using GroupsController, THIS INSERTS USER TO USERS-table as well!! 
      groupsC.updateGroup(customerGroup); 
Verwandte Themen