Jpa 防止并发修改。日食(乐观锁例外)

Jpa 防止并发修改。日食(乐观锁例外),jpa,eclipselink,ejb-3.0,optimistic-locking,Jpa,Eclipselink,Ejb 3.0,Optimistic Locking,问题: 两个管理员->Admin1和Admin2同时修改来自不同终端的UserA 用户和用户组实体之间存在多对多关系 这里发生的情况是,当Admin1将Group1分配给UserA时,信息被保存。 当来自不同终端的Admin2将Group2分配给UserA时,保存的信息将覆盖Admin1所做的更改。意味着当我签入DB时,UserA被分配到Group2,而Admin2不知道Admin1所做的更改 这是乐观的情况吗 如果这是乐观的情况,那么为什么不抛出乐观锁例外 如何将Admin1所做的更改通知Ad

问题:

两个管理员->Admin1和Admin2同时修改来自不同终端的UserA

用户和用户组实体之间存在多对多关系

这里发生的情况是,当Admin1将Group1分配给UserA时,信息被保存。 当来自不同终端的Admin2将Group2分配给UserA时,保存的信息将覆盖Admin1所做的更改。意味着当我签入DB时,UserA被分配到Group2,而Admin2不知道Admin1所做的更改

  • 这是乐观的情况吗
  • 如果这是乐观的情况,那么为什么不抛出乐观锁例外
  • 如何将Admin1所做的更改通知Admin2
  • 使用Eclipselink如下所示:

        @ManyToMany
        @JoinTable(name = "user_group", joinColumns = { @JoinColumn(name = "user_group_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") })
        private List<User> userList;
    
        @ManyToMany
        @JoinTable(name = "user_group",joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "user_group_id", referencedColumnName = "id") })
        private List<UserGroup> userGroupList;
    
    @manytomy
    @JoinTable(name=“user\u group”,joinColumns={@JoinColumn(name=“user\u group\u id”,referencedColumnName=“id”)},inverseJoinColumns={@JoinColumn(name=“user\u id”,referencedColumnName=“id”)})
    私有列表用户列表;
    @许多
    @JoinTable(name=“user\u group”,joinColumns={@JoinColumn(name=“user\u id”,referencedColumnName=“id”)},inverseJoinColumns={@JoinColumn(name=“user\u group\u id”,referencedColumnName=“id”)})
    私有列表用户组列表;
    
    @版本注释标记在版本列上,该列在每次操作时更新


    如果您需要我方提供更多信息,请告知。

    将group1分配给user1时,请保存上次修改的时间戳。下次请求获取user1详细信息时,请确保提供上次修改日期以及其他详细信息。当admin1修改请求时,请他提供与get操作期间相同的上次修改日期。在保存请求之前,将上次修改的日期与您提供给admin1的日期进行比较。基本上,这里最后修改的日期是一种标记。您存储一个令牌,将其提供给访问数据的用户,然后当用户修改数据并将其发送给持久化操作时,确保数据库中的令牌与用户返回给您的令牌匹配,否则表示记录已被修改,令牌在数据库中已更改,不允许用户持久化坏数据

    希望这有帮助