【问题标题】:JPA ManyToMany Inserting duplicate valuesJPA ManyToMany 插入重复值
【发布时间】:2017-04-16 04:28:19
【问题描述】:

我有以下型号:

@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())

无论哪种方式,角色都会再次插入数据库中。

例如

如果这些是数据库中的现有角色:

ID   Name
1    ADMIN
2    USER

我插入了一个具有 ADMIN 角色的用户,它被再次插入:

ID Name
1  ADMIN
2  USER
3  ADMIN

我该如何解决这个问题?

我已经尝试过post 中的解决方案,但没有奏效。

【问题讨论】:

  • 你是如何获得角色实例的?

标签: spring postgresql jpa


【解决方案1】:

角色的名称不是实体的标识符,也不是唯一的。因此,如果您执行以下操作,role 对象的 id 将为空:

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);

【讨论】:

  • 这就是我要找的......但是有一个问题:我们不能只将角色对象存储在某个地方,以免每次都从数据库中提取它吗?
猜你喜欢
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
相关资源
最近更新 更多