首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用CRUD存储库保存具有现有子项的实体失败,原因是密钥重复

使用CRUD存储库保存具有现有子项的实体失败,原因是密钥重复
EN

Stack Overflow用户
提问于 2015-12-16 04:50:51
回答 1查看 1.9K关注 0票数 0

一个User可以有多个Authorities。默认情况下,当我创建一个新用户时,我想给他添加ROLE_USER权限。

这是用户实体:

代码语言:javascript
复制
@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<>();

和授权实体:

代码语言:javascript
复制
@Entity
public class Authority
{
    @Id
    private String authority;

我使用的是基本的UserRepositoryAuthorityReposiroty,它们都是对CrudRepository的扩展。

这是注册新用户的方法:

代码语言:javascript
复制
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!";
}

当我尝试注册新用户时,会失败,并显示以下错误:

代码语言:javascript
复制
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "uk_c1gaghspdr9qx2yt45moye10y"
  Detail: Key (authority)=(ROLE_USER) already exists.

我可以在日志中看到Hibernate正在尝试插入ROLE_USER权限,这是不可能的,因为它已经存在,但我不明白为什么。我还没有在@OneToMany注解上设置层叠属性。

我如何实现我想要的?

这是我的配置:

代码语言:javascript
复制
compile('org.springframework.boot:spring-boot-starter-data-jpa')
runtime('org.postgresql:postgresql:9.4-1206-jdbc42')

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-16 05:38:59

问题出在关系上。你有OneToMany -意味着在另一个网站上是relation ManyToOne...如果您在一个用户中使用了某个权限,则不能将此实体(对象)用于其他用户。

您的问题的解决方案是将关系更改为User类中的@ManyToMany实例@OneToMany。它的强度很小,但实际上它是关系ManyToMany,因为用户可以拥有多个权限,任何权限都可以在许多用户中使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34299142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档