相信大家都遇见过这样的一个场景:
在一个对象的实例列表中,只允许有一个是默认的实例,这个属性用一个COLUMN来管理,叫做:isDefault。
当用户新增或者更新某个对象实例的时候,如果要把这个对象变为默认对象,需要检测列表中是否有默认对象,如果有,就把旧的默认对象的 isDefault = false,拿一个角色实例演示这个场景,实现代码如下:
Role newDefultRole = new Role();
newDefaultRole.setIsDefault("1");
if ("1".equals(newDefaultRole.getIsDefault())){
Role oldDefaultRole = roleService.getRoleByDefault("1")
oldDefaultRole.setIsDefault("0");
roleService.save(oldDefaultRole);
}
roleService.save(newDefaultRole);
当执行上述代码的时候,红字部分报错,说结果不唯一,原因是,Hibernate把当前还没有持久化的newDefaultRole也给遍历出来了!
一种解决方案,就是用HQL单独在action中先提前更新旧默认实例,这样就会出现两次提交的现象,比较影响性能。
这种情况大家一般是如何解决呢?