有没有办法防止在具有自动生成主键的实体上使用hibernate重复输入数据?
更具体地说,我在数据库中有一个持久对象并且有一个临时对象(尚未插入到数据库中),并且这两个对象在equals和hashcode方法方面是相同的。但是,由于这些对象的实体类的id使用生成的值注释进行注释,因此hibernate仍会为数据库中的瞬态对象创建新实例。因此,数据库具有不同主键的重复条目(关于equals和hashcode方法)。
是的,我知道如果我不自动生成PK,如果我使用UUID,那么我会实现我的目标。但我只是想问为什么equals和hashcode方法不适用于具有自动生成主键的实体?或者我做错了什么?
答案 0 :(得分:4)
为什么equals和hashcode方法不起作用
Hibernate不尊重equals()
/ hashCode()
,因为没有有效的方法。
Hibernate如何在数据库中检查具有相同标识的对象(以equals()
表示)?由于equals()
可以包含任意条件,因此Hibernate无法将其转换为SQL查询,因此检查它的唯一方法是将所有对象加载到内存中并在其上调用equals()
以将它们与你要保存的对象。
因此,Hibernate使用主键来定义对象的身份。
或者我做错了什么?
目前尚不清楚你将要实现的目标。如果您希望Hibernate使用您传入的对象状态更新数据库中的对象,则需要使用merge()
。
另见:
答案 1 :(得分:2)
数据库级别的主键应使用您在应用程序级别测试相等性的相同字段。如果你真的需要一个代理键(出于性能原因,也许?)对这些字段强制执行“唯一索引”,让hibernate抛出异常。
答案 2 :(得分:0)
在数据库级别强制执行约束。如果没有这个,很难(不可能?)避免重复,特别是如果您的应用程序是群集的。