1

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

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

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

4

3 回答 3

4

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

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

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

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

还是我做错了什么?

目前尚不清楚您要实现什么目标。如果你想让 Hibernate 用你传入的对象的状态来更新数据库中的对象,你需要使用merge().

也可以看看:

于 2011-03-24T14:27:58.590 回答
2

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

于 2011-03-24T14:36:46.957 回答
0

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

于 2011-03-24T14:19:46.677 回答