在我的应用程序中,我必须添加一些功能,可以从数据库中删除用户。我的用户最多可以具有三个角色(这是一个角色)-USER,EDITOR和ADMIN。用户类型很少,但是它们都扩展了AbstractUser类。在这里:
router.use("/a", function(req, res, next){ return res.status(200).json({a: "a"})});
router.use("/a/v1", function(req, res, next){ return res.status(200).json({a: "b"})});
// request on /a or /a/v1 will always return a
router.use("/a/v1", function(req, res, next){ return res.status(200).json({a: "b"})});
router.use("/a", function(req, res, next){ return res.status(200).json({a: "a"})});
// work correctly
router.get("/a", function(req, res, next){ return res.status(200).json({a: "a"})});
router.get("/a/v1", function(req, res, next){ return res.status(200).json({a: "b"})});
// work correctly
router.get("/a/v1", function(req, res, next){ return res.status(200).json({a: "b"})});
router.get("/a", function(req, res, next){ return res.status(200).json({a: "a"})});
// work correctly
由于CascadeType.ALL,当我要删除用户时,我收到IntegrityViolationException,因为程序要与删除的用户一起删除Role实体,所以当然不会发生:
@MappedSuperclass
@Getter
@Setter
public abstract class AbstractUser extends BaseEntity {
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<Role> roles = new HashSet<>();
}
使用setRoles对具有空Set的用户来说,这件事很容易绕开,所以这是现在的样子:
Referential integrity constraint violation: "FKJULYW7FW6N9F67QYIID41SEP6: PUBLIC.USER_ROLE FOREIGN KEY(ROLES_ID) REFERENCES PUBLIC.ROLE(ID) (1)"; SQL statement:
delete from role where id=? and version=? [23503-197]
这种方法有效,但远非理想,我认为是从存储库中检索User实体,将其Roles设置为空Set,然后在数据库中仅使用 @Test
public void userRemovalThrowsNoException() {
User user = userRepository.findById(6L).get();
user.setRoles(Collections.emptySet());
userRepository.save(user);
userRepository.delete(user);
}
方法对其进行更新,因为这是多余的冗余代码。我的问题是,不执行不必要的操作而删除用户实体的最有效方法是什么?