在JPA中,我们在实体更新前(@PreUpdate)来维护实体的更新信息(lastModifiedBy、lastModifiedOn)。
但是这样做会存在问题。主要问题是,这个维护信息是在数据库层面的,而我们希望记录的是逻辑层面的。
下面通过一个场景来展示问题所在。
在删除角色之前,我们要先断开角色与用户的关联关系,然后才删除角色。下面是删除角色的manager层代码(RoleManager.remove(Integer id)):
@Override
public void remove(Integer id) {
// 删除角色前,先更新拥有该角色的用户
List<User> users = userManager.listByRoleId(id);
Role role = get(id);
for (User user : users) {
user.getRoles().remove(role);
userManager.saveOrUpdate(user);
}
getEntityDao().remove(role);
}
在这段代码里,任何一个与要删除角色相关联的用户,都会被更新,同时系统也会记录用户的更新信息(lastModifiedBy、 lastModifiedOn)。而事实上,我们可能是希望在用户的基本信息修改时去维护这两个字段(业务层面),在用户角色发生变化时不去维护这些字 段。
这里先记录问题。
由于问题涉及到我们系统设计层面的问题,希望大家参与讨论,踊跃发表自己的意见!