2011-06-17 114 views
0

从来就所有实体获得类似这样的一个问题:休眠 - 检索由外键特定实体引用

How to find all foreign keys?

我倒是想使休眠告诉我一个实体是否被引用在外部数据库中的某处。背景是:我想在我的应用程序中实现类似JIRA的行为:只删除一个用户,如果没有对它的引用,并且拒绝删除操作。

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

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

问候, 克里斯

回答

2

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

  • 地图双方在Hibernate中关系的(确保它们与inverse=true这样标记,Hibernate并不尝试和使用侧用于更新数据库)。然后,当你想删除一个用户时,只要确保各种关系的.size()属性为0.我相信这将是'典型'的Hibernate解决方案。
    • 缺点 - 一旦你在对象中拥有关系的那一面,就可以使用它。双向关联可能会非常棘手,需要充分理解。
  • 查询每个关系检查以查看您尝试删除的用户是否在其设置中。这是最不干扰的方法。您可以使用计数查询来避免必须将实体发送到Java。
    • 缺点 - 这是最低效的方法。
  • 使用本地SQL如果你尝试删除,并抓住你就已经依托SQL例外(一些数据库没有外键的概念)。在这一点上,您最好只用本机SQL发布查询。
    • 缺点 - 这会增加程序对SQL的依赖性。
+0

感谢您的阐述,这些都是我已经想到的方案(2)似乎对我来说很正确的方式。但是由于我不需要双向关系,我不想仅仅为了这个功能而介绍它们,它提出了一个缺点,即每次更改数据库模型时都必须更新删除操作,否则将运行进入其他外键违规行为。不管怎样,谢谢! – ChrisAux 2011-06-17 12:52:13