Java 如何在插入前检查记录是否存在

Java 如何在插入前检查记录是否存在,java,hibernate,orm,Java,Hibernate,Orm,我使用的是Hibernate4.3.6Final和MySQL 5.5.37 假设我有两个表Book和Words,还有一些代码解析书中的单词并将它们添加到Words表中。肯定会有一些词出现在不止一本书中。但是,如果一个单词已经在数据库中,我不希望它有一个新的条目。唯一的问题是Hibernate是否足够聪明,能够为此提供某种功能 有几种解决方案,但没有一种是好的: 在创建anyWord对象之前,请检查数据库中是否已有类似的对象。表演太糟糕了 捕获尝试插入副本时引发的异常并处理该异常。可怕的做法 对数

我使用的是Hibernate4.3.6Final和MySQL 5.5.37

假设我有两个表
Book
Words
,还有一些代码解析书中的单词并将它们添加到
Words
表中。肯定会有一些词出现在不止一本书中。但是,如果一个单词已经在数据库中,我不希望它有一个新的条目。唯一的问题是Hibernate是否足够聪明,能够为此提供某种功能

有几种解决方案,但没有一种是好的:

  • 在创建any
    Word
    对象之前,请检查数据库中是否已有类似的对象。表演太糟糕了
  • 捕获尝试插入副本时引发的异常并处理该异常。可怕的做法
  • 对数据库中的单词建立某种静态索引,定期更新,然后在列表中搜索单词。可能会稍微快一点,但在性能和内存方面仍然很糟糕

  • 有更好的方法吗?

    您有三种选择:

  • 从客户端(Hibernate)查看记录是否存在,如果不存在,则插入(可能取决于竞争条件)
  • 尝试插入记录,处理错误。你说这是个坏习惯,但我认为这是个好习惯
  • 在数据库中放入触发器,如果记录存在,则跳过插入

  • 我会选择#2

    虽然我理解不喜欢使用异常处理作为逻辑特性,但这个实例完全可以接受,而且#2是最好的选择。在本例中,您将利用Word表中唯一索引的功能,并忽略它引发的任何异常。这也是我想要做的,但我使用DAO将所有对象保存在数据库中。这意味着我要为公共DB操作共享一个类,这反过来意味着我必须为通用类中的特定情况编写一个特殊情况。不知何故,这似乎是非常错误的。