Spring Data JPA向层叠添加异常

时间:2018-07-30 15:01:05

标签: hibernate spring-boot spring-data-jpa cascade

在我的应用程序中,我必须添加一些功能,可以从数据库中删除用户。我的用户最多可以具有三个角色(这是一个角色)-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); } 方法对其进行更新,因为这是多余的冗余代码。我的问题是,不执行不必要的操作而删除用户实体的最有效方法是什么?

0 个答案:

没有答案