2017-04-16 61 views
1

我有以下型號:JPA多對多插入重複值

@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`", 
    [email protected](name="`userId`",referencedColumnName="`userId`"), 
    [email protected](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<>(); 
... 

被映射到下表:

E-R 我試圖插入用戶在以下兩個方面現有角色:

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的解決方案,但沒有奏效。

+0

你怎麼角色實例? – Cherif

回答

1

角色的名稱不是實體的標識符,也不是唯一的。然後

Role role = new Role(); 
role.setName("ADMIN"); 
user.getRoles().add(role); 
repository.save(user); 

JPA會認爲你通過了新的對象和它的基礎上的@GeneratedValue註釋會生成一個新的ID:所以,如果你這樣做了role對象的ID將是空的。

假設你使用Spring的數據,你需要做這樣的事情:

Role role = roleRepository.findByName("ADMIN"); 
user.getRoles().add(role);