由于重复键,使用 CRUD 存储库保存具有现有子项的实体失败
Saving entity with existing children with CRUD Repository fails because of duplicate key
一个User
可以有多个Authorities
。默认情况下,当我创建一个新用户时,我想给他添加 ROLE_USER
权限。
这是用户实体:
@Entity
@Table(name = "Users")
public class User
{
@Id
private String username;
private String password;
private String email;
@OneToMany
@JoinTable(
name = "UserAuthority",
joinColumns = @JoinColumn(name = "username"),
inverseJoinColumns = @JoinColumn(name = "authority"))
private List<Authority> authorities = new ArrayList<>();
和权威实体:
@Entity
public class Authority
{
@Id
private String authority;
我正在使用基本的 UserRepository
和 AuthorityReposiroty
都扩展了 CrudRepository
。
这是注册新用户的方法:
public String register(User user)
{
if (userRepository.findOne(user.getUsername()) != null)
{
return "User with given username already exists!";
}
user.setPassword(passwordEncoder.encode(user.getPassword()));
user.getAuthorities().add(authRepository.findOne("ROLE_USER"));
userRepository.save(user);
return "User successfully registered!";
}
当我尝试注册新用户时失败并出现以下错误:
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "uk_c1gaghspdr9qx2yt45moye10y"
Detail: Key (authority)=(ROLE_USER) already exists.
我可以在日志中看到 Hibernate 正在尝试插入 ROLE_USER
权限,这是不可能的,因为它已经存在,但我不明白为什么。我还没有在 @OneToMany
注释上设置级联 属性。
如何实现我想要的?
这是我的配置:
compile('org.springframework.boot:spring-boot-starter-data-jpa')
runtime('org.postgresql:postgresql:9.4-1206-jdbc42')
提前致谢!
关系有问题。你有 OneToMany - 意味着在其他站点上是 ManyToOne 关系......如果你在一个用户中使用了一些权限,你不能将这个实体(对象)用于其他用户。
您的问题的解决方案正在改变与用户 class 中 @ManyToMany
的关系 @OneToMany
。强度不大,但实际上是ManyToMany关系,因为User可以有多个权限,任意权限都可以在多个用户中使用。
一个User
可以有多个Authorities
。默认情况下,当我创建一个新用户时,我想给他添加 ROLE_USER
权限。
这是用户实体:
@Entity
@Table(name = "Users")
public class User
{
@Id
private String username;
private String password;
private String email;
@OneToMany
@JoinTable(
name = "UserAuthority",
joinColumns = @JoinColumn(name = "username"),
inverseJoinColumns = @JoinColumn(name = "authority"))
private List<Authority> authorities = new ArrayList<>();
和权威实体:
@Entity
public class Authority
{
@Id
private String authority;
我正在使用基本的 UserRepository
和 AuthorityReposiroty
都扩展了 CrudRepository
。
这是注册新用户的方法:
public String register(User user)
{
if (userRepository.findOne(user.getUsername()) != null)
{
return "User with given username already exists!";
}
user.setPassword(passwordEncoder.encode(user.getPassword()));
user.getAuthorities().add(authRepository.findOne("ROLE_USER"));
userRepository.save(user);
return "User successfully registered!";
}
当我尝试注册新用户时失败并出现以下错误:
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "uk_c1gaghspdr9qx2yt45moye10y"
Detail: Key (authority)=(ROLE_USER) already exists.
我可以在日志中看到 Hibernate 正在尝试插入 ROLE_USER
权限,这是不可能的,因为它已经存在,但我不明白为什么。我还没有在 @OneToMany
注释上设置级联 属性。
如何实现我想要的?
这是我的配置:
compile('org.springframework.boot:spring-boot-starter-data-jpa')
runtime('org.postgresql:postgresql:9.4-1206-jdbc42')
提前致谢!
关系有问题。你有 OneToMany - 意味着在其他站点上是 ManyToOne 关系......如果你在一个用户中使用了一些权限,你不能将这个实体(对象)用于其他用户。
您的问题的解决方案正在改变与用户 class 中 @ManyToMany
的关系 @OneToMany
。强度不大,但实际上是ManyToMany关系,因为User可以有多个权限,任意权限都可以在多个用户中使用。