Hibernate - 检索特定实体的外键引用的所有实体

时间:2011-06-17 11:26:10

标签: hibernate foreign-keys

我有一个与此类似的问题:

How to find all foreign keys?

我想让Hibernate告诉我是否通过外键在数据库中的某个地方引用了一个实体。背景是:我想在我的应用程序中实现类似JIRA的行为:只删除用户,如果没有对它的引用,否则拒绝删除操作。

我知道可能存在性能问题,但首先,我只想知道这是否可行,或者您是否可以想出更好的方法来实现这一目标。

执行此操作的一种方法是调用delete并捕获以下异常,但我相信必须有更好或更优雅的方法来执行此操作?

问候, 克里斯

1 个答案:

答案 0 :(得分:2)

Hibernate对MySQL的外键没有概念或意识。我能想到的一些选择是:

  • 在Hibernate中映射关系的双方(确保用inverse=true标记它们,以便Hibernate不会尝试使用该方来更新数据库)。然后,当您要删除用户时,请确保各种关系的.size()属性为0.我相信这将是“典型的”Hibernate解决方案。
    • 缺点 - 一旦你在对象中拥有关系的那一面,它就会很有诱惑力。双向关联可能很棘手,需要很好理解。
  • 查询每个关系,检查您要删除的用户是否在其设置中。这是最不具侵入性的方法。您可以使用计数查询来避免必须将实体发送到Java。
    • 缺点 - 这是效率最低的方法。
  • 使用本机SQL 如果您尝试删除并捕获您已经依赖SQL的异常(某些数据库没有外键的概念)。那时你最好只在本机SQL中发出查询。
    • 缺点 - 这会将程序中的依赖项添加到SQL中。