Hibernate JoinTable行以某种方式随机删除

时间:2017-02-17 14:28:05

标签: hibernate jpa spring-data

我的用户 - >角色关系表已经神奇地随机地从中删除了行。我们不能重现这个问题,但它发生在生产环境中。它只发生在prod中,并且只有当很多人使用该系统时才会发生这种情况,导致我们认为这是一个并发问题。下面是我定义的映射。

我们只有少数地方可以修改用户或角色。这些地方都不会导致问题发生!此外,没有其他系统可以对数据库起作用。

  1. 登录会保存用户以设置其上次登录日期,或者如果他们多次登录失败,则将其锁定。
  2. 用户管理 - 编辑用户和分配角色。这可以在关系中添加或删除角色,但执行任一操作都不会导致问题发生
  3. 角色管理 - 创建或编辑角色但您无法将用户分配到此界面中的角色。
  4. 用户可以更改自己的密码,从而保存用户记录
  5. // User.java

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "user_roles", joinColumns = {
    @JoinColumn(name = "user_id", referencedColumnName = "id") },
                 inverseJoinColumns = {@JoinColumn(name = "role_id") })
    public Set<Role> getRoles() {
        return this.roles;
    }
    

    // Role.java

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "roles")
    public Set<User> getUserRoles() {
        return this.userRoles;
    }
    

1 个答案:

答案 0 :(得分:2)

根据您的说明,您应该删除Role上的加入列标注,然后只需指定@ManyToMany(fetch = FetchType.LAZY, mappedBy = "roles")

通过这种方式,您不允许双方独立管理关系,这可能就是您遇到此问题的原因。

它与并发性无关,而是对谁拥有用户与角色之间关系的不正确映射。现在你的映射表明双方都拥有它,因此修改Role可能会产生意想不到的后果。