每当我将用户及其角色保存到我的数据库时,它还会在我的Role表中添加一个额外的行。
每个用户都有许多角色,每个角色都可以属于许多用户。)
我的数据库中有3个表:
users
(id,username)roles_users
(user_id,role_id)roles
(id,role) E.g。我在Role
表(ROLE_ADMIN
,ROLE_USER
)中有两个角色,我保存了一个角色为ROLE_ADMIN
的用户,我的roles_users
表已更新,但是我的Role
表中也会创建一个新行(我想阻止它)。
有几种方法可以防止这种情况发生:
user
和roles_users
表格所以我的问题是,使用hibernate有更好的方法吗?
这是我的User
型号:
@Entity(name = "users")
public class User{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String username;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "roles_users",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"),
uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", "role_id"})})
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;
}
}
这是我的Role
型号:
@Entity(name = "roles")
public class Role {
@Id
//@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@ManyToMany(mappedBy = "roles", cascade = CascadeType.PERSIST)
private Set<User> users;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = 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;
}
}
这是我用来保存用户及其角色的代码:
User user = new User();
Role role = new Role();
user.setUsername("john");
role.setName("Admin");
role.setId(Long.valueOf(1));
role.getUsers().add(user);
user.getRoles().add(role);
userService.saveUser(user);
答案 0 :(得分:1)
问题是您正在创建角色实例,然后将用户添加到该角色,然后再从该用户实例再次添加相同角色,因此您有两个角色对象分配给该用户,这就是为什么要存储两个企业所以删除第二行代码再次添加角色对象并使用以下代码保存用户,它应该适合你 -
User user = new User();
Role role = new Role();
user.setUsername("john");
role.setName("Admin");
role.setId(Long.valueOf(1));
role.getUsers().add(user);
userService.saveUser(user);
而不是上面尝试使用角色的保存方法。