我有以下型号:
@Entity
@Table(name="`tbUser`")
public class User {
@Id
@SequenceGenerator(name="tbuser_id_seq",
sequenceName="tbuser_id_seq",
allocationSize=1)
@Column(name="`userId`")
@GeneratedValue
private Long id;
@Column(name="username")
private String username;
@Column(name="password")
private String password;
@Column(name="nombres")
private String firstName;
@Column(name="apellidos")
private String lastName;
@Column(name="email")
private String email;
@Column(name="`avatarUrl`")
private String avatarUrl;
@ManyToMany(fetch=FetchType.EAGER, cascade=CascadeType.MERGE)
@JoinTable(name="`tbUserRole`",
joinColumns=@JoinColumn(name="`userId`",referencedColumnName="`userId`"),
inverseJoinColumns=@JoinColumn(name="`roleId`",referencedColumnName="`roleId`"))
private List<Role> roles = new ArrayList<>();
...
@Entity
@Table(name="`tbRole`")
public class Role {
@Id
@Column(name="`roleId`")
@GeneratedValue
private Long id;
@Column(name="name")
String name;
@ManyToMany(mappedBy="roles")
private List<User> users = new ArrayList<>();
...
映射到以下表格:
user.getRoles().add(role) and repository.save(new User())
无论哪种方式,角色都会再次插入数据库中。
例如
如果这些是DB中的现有角色:
ID Name
1 ADMIN
2 USER
我插入一个具有ADMIN角色的用户,再次插入:
ID Name
1 ADMIN
2 USER
3 ADMIN
我该如何解决这个问题?
我已经尝试了post中的解决方案,但没有用。
答案 0 :(得分:2)
角色的名称不是实体的标识符,也不是唯一的。因此,如果您执行以下操作,role
对象的id将为null。
Role role = new Role();
role.setName("ADMIN");
user.getRoles().add(role);
repository.save(user);
JPA将假设您传递了一个新对象,并将根据@GeneratedValue
注释为其生成一个新ID。
假设您使用Spring Data,您需要执行以下操作:
Role role = roleRepository.findByName("ADMIN");
user.getRoles().add(role);