为何移除系统用户的过滤器会将系统用户从群组移除并持久化到数据库?
问题解决思路
问题核心是直接修改了group持久化实体的Users属性——因为group是和数据库映射的对象,ORM框架会自动跟踪它的属性变化,最终把过滤后的用户列表同步到数据库,导致系统用户被永久移除。
给你两个可行的解决办法:
方法一:使用临时列表(推荐)
完全不触碰原group的Users持久化属性,生成一个临时的过滤用户列表,把这个临时列表传给轮询分配方法(需要调整assignUserByRoundRobin的参数,让它支持接收自定义用户列表):
function assignToNonSystemUser_Ext(group : Group) : void { // 生成临时过滤用户列表,不修改原群组的持久化属性 val filteredUsers = group.MembersNoSystemUsers.where(user -> user.User.Credential.Active and user.User.VacationStatus == VacationStatusType.TC_ATWORK) // 传入临时列表执行轮询分配逻辑 this.assignUserByRoundRobin(false, group, filteredUsers) }
方法二:备份恢复原用户列表
如果没法修改assignUserByRoundRobin的参数,就先备份原Users数据,执行完轮询后立刻恢复,确保实体属性不会被ORM同步到数据库:
function assignToNonSystemUser_Ext(group : Group) : void { // 备份原群组的用户列表 val originalUsers = group.Users try { // 临时修改用户列表用于轮询分配 group.Users = group.MembersNoSystemUsers.where(user -> user.User.Credential.Active and user.User.VacationStatus == VacationStatusType.TC_ATWORK) this.assignUserByRoundRobin(false, group) } finally { // 恢复原用户列表,避免修改被持久化到数据库 group.Users = originalUsers } }
两种方法都能实现“临时过滤用户用于轮询,不改动数据库中群组用户数据”的需求,优先选方法一,逻辑更清晰也更安全。
内容的提问来源于stack exchange,提问作者Enna Warner
相关产品推荐
相关产品推荐

