休眠如何防止与生成的ID重复条目

问题描述:

有没有一种方法来防止与自动生成主键的实体上的hibernate重复的数据输入?休眠如何防止与生成的ID重复条目

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

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

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

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

Hibernate不尊重equals()/hashCode()这里,因为没有有效的方式来做到这一点。

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

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

或者我做错了什么?

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

参见:

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