Java Hibernate如何防止生成id的重复条目
在具有自动生成主键的实体上,是否有方法防止使用hibernate重复输入数据 更具体地说,我在数据库中有一个持久对象,还有一个临时对象(尚未插入数据库),这两个对象在equals和hashcode方法方面是相同的。但是,由于这些对象的实体类的id使用生成的值注释进行注释,hibernate仍然在数据库中为临时对象创建一个新实例。因此,数据库具有具有不同主键的重复条目(关于equals和hashcode方法)Java Hibernate如何防止生成id的重复条目,java,hibernate,jpa,generated,Java,Hibernate,Jpa,Generated,在具有自动生成主键的实体上,是否有方法防止使用hibernate重复输入数据 更具体地说,我在数据库中有一个持久对象,还有一个临时对象(尚未插入数据库),这两个对象在equals和hashcode方法方面是相同的。但是,由于这些对象的实体类的id使用生成的值注释进行注释,hibernate仍然在数据库中为临时对象创建一个新实例。因此,数据库具有具有不同主键的重复条目(关于equals和hashcode方法) 是的,我知道如果我让PK不是自动生成的,如果我使用UUID,那么我就会实现我的目标。但我
是的,我知道如果我让PK不是自动生成的,如果我使用UUID,那么我就会实现我的目标。但我只想问为什么equals和hashcode方法不适用于具有自动生成主键的实体?还是我做错了什么?在DB级别强制执行约束。如果没有这一点,就很难(不可能?)避免重复,尤其是如果你的应用程序是群集的。在DB级别强制执行该约束。如果没有这一点,就很难(不可能?)避免重复,尤其是如果你的应用程序是集群的 为什么equals和hashcode方法不起作用 Hibernate在这里不尊重
equals()
/hashCode()
,因为没有有效的方法来做到这一点
Hibernate如何检查数据库中已存在具有相同标识(就equals()
)的对象?由于equals()
可以包含任意条件,Hibernate无法将其转换为SQL查询,因此检查它的唯一方法是将所有对象加载到内存中,并对它们调用equals()
,将它们与要保存的对象进行比较
因此Hibernate使用主键定义对象的标识
还是我做错了什么
现在还不清楚你将实现什么。如果希望Hibernate使用传入对象的状态更新数据库中的对象,则需要使用merge()
另请参见:
equals()
/hashCode()
,因为没有有效的方法来做到这一点
Hibernate如何检查数据库中已存在具有相同标识(就equals()
)的对象?由于equals()
可以包含任意条件,Hibernate无法将其转换为SQL查询,因此检查它的唯一方法是将所有对象加载到内存中,并对它们调用equals()
,将它们与要保存的对象进行比较
因此Hibernate使用主键定义对象的标识
还是我做错了什么
现在还不清楚你将实现什么。如果希望Hibernate使用传入对象的状态更新数据库中的对象,则需要使用merge()
另请参见: