我使用Hibernate使用带有Web界面(Spring MVC)的java应用程序。我有一个非常简单的数据库方案,其中有一个 Group 实体,你可以在一个网页上添加/删除它。然后还有另一个具有组的实体作为其字段实体具有到组的FK。请注意,通常可能有许多其他实体引用我的组。
如果我想删除 Group 对象,它可能在FK约束上失败 - 该组由其他实体引用。
有没有办法检查我的组是否被引用,删除会失败而不是执行删除并捕获异常?这里的最佳做法是什么?
由于
注意:为了清楚起见,简单选择不是解决方案,因为 Group 可能被许多其他表格引用,而不仅仅是一个。
答案 0 :(得分:6)
在删除之前进行检查效率较低,如果在您检查的那一刻和您删除的那一刻之间由另一个事务添加了某些链接,则可能仍会导致约束违规。
另一方面,它允许向用户显示更具体的错误消息(例如“该组仍被FooBar引用”)。
在您的具体情况下,做您认为最好的事情。但请注意,如果发生某些异常,则应回滚整个事务,并且应关闭会话,因为此类异常会使会话处于不一致状态。此外,它不是删除,而是抛出异常的刷新或提交。
现在,如果你想检查,没有神奇的解决方案。您可能具有双向关联,因此您可以检查group.getUsers()
是否为emtpy(尽管这将获取该组的所有用户)。或者,您可以执行select count(user.id) from User user where user.group = :group
之类的专用查询,以了解该组是否仍被引用。但是你需要为每个可能的小组参考做其中一个。
答案 1 :(得分:0)
您可以根据群组ID在实体上执行SELECT COUNT
,如果返回值为0,则只尝试删除群组。
使用try / catch包围删除有什么问题?
答案 2 :(得分:0)
使用JPA,您通常也应该在domainobject组中拥有引用集合。因此,在删除组之前,您可以检查所有这些集合是否为空。但请记住,这可能会在删除之前花费一些额外的时间,但在删除失败时可能需要通知用户当前关联的对象。