休眠ManyToMany实现

时间:2019-12-15 22:22:51

标签: java sql database hibernate spring-boot

我与多对多用户<->角色关系。 用户实体如下所示:

@Entity
@Table(name = "user",
        uniqueConstraints = {@UniqueConstraint(columnNames = {"username", "email"})})
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    private Long id;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "user_roles",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
    private Set<Role> roles = new HashSet<>();
}

角色实体如下:

@Entity
@Table(name = "role")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", updatable = true, nullable = false)
    private Long id;

    @Enumerated(EnumType.STRING)
    @Column(length = 60, name = "roleName", updatable = true, nullable = false)
    private RoleName roleName;
}

一切正常,除了一件事。当我插入两个具有相同角色的用户时,角色表将获得两个具有相同角色但ID不同的记录。

enter image description here

问题是,我可以消除这种现象吗?理想情况下,ROLES表不应包含重复的角色。

任何建议将不胜感激。 :)

1 个答案:

答案 0 :(得分:0)

我在您的实体映射中找不到问题。问题应该出在您试图保存用户实体的业务逻辑中。

如果您将尚未保存的角色实体设置为 User ,则可能会出现您描述的问题。换句话说,您的角色还没有 id 字段。

您需要从持久性提供商那里获取角色,并将其设置为 User

如果您使用的是spring-data,则可能类似于:

User user = ....
Role role = rolesRepository.findByName(roleName);
user.setRole(role); 
// The persist User