Hibernate如何防止生成id的重复条目

时间:2011-03-24 14:07:40

标签: java hibernate jpa generated

有没有办法防止在具有自动生成主键的实体上使用hibernate重复输入数据?

更具体地说,我在数据库中有一个持久对象并且有一个临时对象(尚未插入到数据库中),并且这两个对象在equals和hashcode方法方面是相同的。但是,由于这些对象的实体类的id使用生成的值注释进行注释,因此hibernate仍会为数据库中的瞬态对象创建新实例。因此,数据库具有不同主键的重复条目(关于equals和hashcode方法)。

是的,我知道如果我不自动生成PK,如果我使用UUID,那么我会实现我的目标。但我只是想问为什么equals和hashcode方法不适用于具有自动生成主键的实体?或者我做错了什么?

3 个答案:

答案 0 :(得分:4)

  

为什么equals和hashcode方法不起作用

Hibernate不尊重equals() / hashCode(),因为没有有效的方法。

Hibernate如何在数据库中检查具有相同标识的对象(以equals()表示)?由于equals()可以包含任意条件,因此Hibernate无法将其转换为SQL查询,因此检查它的唯一方法是将所有对象加载到内存中并在其上调用equals()以将它们与你要保存的对象。

因此,Hibernate使用主键来定义对象的身份。

  

或者我做错了什么?

目前尚不清楚你将要实现的目标。如果您希望Hibernate使用您传入的对象状态更新数据库中的对象,则需要使用merge()

另见:

答案 1 :(得分:2)

数据库级别的主键应使用您在应用程序级别测试相等性的相同字段。如果你真的需要一个代理键(出于性能原因,也许?)对这些字段强制执行“唯一索引”,让hibernate抛出异常。

答案 2 :(得分:0)

在数据库级别强制执行约束。如果没有这个,很难(不可能?)避免重复,特别是如果您的应用程序是群集的。