Java Spring Boot仅在唯一时将角色添加到DB

Java Spring Boot仅在唯一时将角色添加到DB,java,spring,spring-boot,jpa,Java,Spring,Spring Boot,Jpa,我正在构建一个spring引导应用程序,它在用户和角色实体之间具有一对多的关系 用户: @Entity //Marks class as an entity for JPA @Table(name="users") //Gives the table a name @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class User { @Id //Marks variable as id @Gener

我正在构建一个spring引导应用程序,它在用户和角色实体之间具有一对多的关系

用户:

@Entity //Marks class as an entity for JPA
@Table(name="users") //Gives the table a name
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User {

    @Id //Marks variable as id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String name;
    private String phoneNumber;
    private String address;
    private String email;
    private String password;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name="user_role", joinColumns = @JoinColumn(name = "user_id"),inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Collection<Role> roles;
我正试图这样做,当一个用户被保存到数据库使用存储库保存功能使用CrudRepository

void addUser(User user) {
        userRepository.save(user); //adds new user to db.
    }
…通过以下Json对象发送时,用户被添加到数据库中,并且给定的角色类型也附加到该对象:

{
        "name": "John Hancock",
        "phoneNumber": "555-5555-555",
        "address": "address...",
        "email": "John@gmail.com",
        "password": "adhajisdhakjsd",
        "roles":[{
            "role": "Admin"
        }]
    }
下面的代码通过将用户添加到具有附加角色的数据库中来实现,但是添加具有相同角色的其他用户会在数据库中添加一个新的相同角色行

问:有没有办法让新添加的用户只使用已有的with角色而不添加新行

您可以将“角色”设置为主键。但最好不要在这个层次上这样做


您可以在映射阶段映射角色。

如何将
角色
填充到通过
addUser
方法传递的
User
对象?如果
Role
包含
id
它不会复制角色,而是重复使用数据库中已有的内容,另一方面,如果您发送一个没有id的
Role
对象,它将再次存储角色,最好将
唯一约束添加到
角色
@MarcosBarbero。传递给addUser方法的
角色
用户
对象由
crudepository
填充,其中包含一个执行数据库填充的
save()
函数。按照建议添加
@列(unique=true)
后,我收到以下错误:“无法执行语句;SQL[n/a];约束[UK_g50w4r0ru3g9uf6i6fr4kpro8];嵌套异常为org.hibernate.exception.ConstraintViolationException:无法执行语句”该异常是预期的,但我并不完全了解您添加角色的方式,您不能每次都保存角色,否则每次插入时都会出现重复。@MarcosBarbero该角色与用户对象有关系,并使用预定义的
save()添加到数据库中
用户存储库接口上的
crudepository
扩展提供的功能。我想知道的是,如果数据库中已经存在角色,如何将该角色添加到共享的
user\u role
表中。您需要手动将该角色映射到用户对象,否则,它将复制条目。我如何做?具体做什么?
{
        "name": "John Hancock",
        "phoneNumber": "555-5555-555",
        "address": "address...",
        "email": "John@gmail.com",
        "password": "adhajisdhakjsd",
        "roles":[{
            "role": "Admin"
        }]
    }