2016-08-05 23 views
1

Immer, wenn ich versuche, einen Benutzer zu meiner MySQL-Datenbank zu speichern, ist es nur Daten an die Benutzer Tabelle und nicht den Rollen-Benutzer und Rolle Tabelle zu speichern. Einige Hilfe würde sehr geschätzt werden.Hibernate Benutzermodell Benutzer-Rollen und Rollen nicht sparend

(Jeder Benutzer hat viele Rollen und jede Rolle an viele Benutzer gehören, können)

Ich habe 3 Tabellen in meiner Datenbank:

users:  (id,username) 
roles_users: (user_id, role_id) 
roles:  (id,role) 

gefolgt von zwei Hibernate Entitäten:

Dies ist mein Benutzermodell:

@Entity(name = "users") 
public class User{ 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 
private String username; 

@ManyToMany(mappedBy = "users", cascade = CascadeType.PERSIST) 
private Set<Role> roles; 

public Long getId() { 
    return id; 
} 

public String getUsername() { 
    return username; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 

public Set<Role> getRoles() { 
    if (roles == null) { 
     roles = new HashSet(); 
    } 
    return roles; 
} 

public void setRoles(Set<Role> roles) { 
    this.roles = roles; 
} 
} 

Das ist mein Vorbild:

@Entity(name = "roles") 
public class Role { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 
private String name; 

@ManyToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "roles_users", 
     joinColumns = @JoinColumn(name = "role_id"), 
     inverseJoinColumns = @JoinColumn(name = "user_id"), 
     uniqueConstraints = {@UniqueConstraint(columnNames = {"role_id", "user_id"})}) 
private Set<User> users; 

public Long getId() { 
    return id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public Set<User> getUsers() { 
    if (users == null) { 
     users = new HashSet(); 
    } 
    return users; 
} 

public void setUsers(Set<User> users) { 
    this.users = users; 
} 
} 

Dies ist der Code, den ich verwenden, um einen Benutzer und seine Rolle zu speichern (e):

User user = new User(); 
    Role role = new Role(); 
    Set<User> userSet = new HashSet(); 
    Set<Role> roleSet = new HashSet(); 

    user.setUsername("Peter"); 
    role.setName("ROLE_ADMIN"); 
    userSet.add(user); 
    roleSet.add(role); 

    role.setUsers(userSet); 
    user.setRoles(roleSet); 

    userService.saveUser(user); 

Antwort

1

Der Grund, warum Sie beachten Dies liegt daran, dass Role die Entität ist, die die @ManyToMany-Beziehung zwischen ihr und User verwaltet, aber Sie aktualisieren das Objekt Role nicht in deinem Code. Ich würde wahrscheinlich argumentieren, dass das rückwärts ist und dass ein User wahrscheinlich die Beziehung besitzen sollte.

Wenn Sie darüber nachdenken, erstellen Sie Role Objekte separat und später zuweisen Sie sie verschiedenen User Objekte, wie Ihr Code veranschaulicht. Es würde also Sinn machen, dass User diese Beziehung besitzt.

// Transaction 1 
Role role = new Role("ADMIN"); 
session.save(role); 

// Transaction 2 
User user = new User("Naros"); 
user.getRoles().add(roleService.getRoleByName("ADMIN")); 
session.save(user); 
+0

... Ich hätte das schneller gesehen. Ich habe die Beziehung gewechselt und jetzt speichert der Benutzer das Role-Objekt. Danke! –