Java 冬眠

Java 冬眠,java,sql,database,hibernate,spring-boot,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",

我有一个多对多用户角色关系。 用户实体如下所示:

@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<>();
}
除了一件事,一切都很好。当我插入两个具有相同角色的用户时,roles表将获得两个具有相同角色但ID不同的记录

问题是,我能消除这种行为吗?理想情况下,角色表不应包含重复的角色


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

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

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

您需要从持久性提供者处获取角色,并将其设置为用户

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

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

@门塔勒格。重复对他来说是个问题。这就是为什么他问如何消除它:)。他也接受了答案。你还认为我误解了这个问题吗?告诉我们到底是什么问题。如果两个用户具有相同的角色,那么自然需要两条记录—一条记录定义用户1具有此角色,另一条记录定义用户2具有此角色。如果有100个用户具有此角色,则将有100条记录具有此角色。到底是什么问题?当我添加更多具有相同角色名称的用户(角色实体不是来自数据库)时,角色表得到更新,最后该表包含具有不同id的重复角色。但是az@Johna提到,我在业务逻辑上犯了一个错误。(应从数据库中检索角色实体)
User user = ....
Role role = rolesRepository.findByName(roleName);
user.setRole(role); 
// The persist User