Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate如何防止生成id的重复条目_Java_Hibernate_Jpa_Generated - Fatal编程技术网

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

Java Hibernate如何防止生成id的重复条目,java,hibernate,jpa,generated,Java,Hibernate,Jpa,Generated,在具有自动生成主键的实体上,是否有方法防止使用hibernate重复输入数据 更具体地说,我在数据库中有一个持久对象,还有一个临时对象(尚未插入数据库),这两个对象在equals和hashcode方法方面是相同的。但是,由于这些对象的实体类的id使用生成的值注释进行注释,hibernate仍然在数据库中为临时对象创建一个新实例。因此,数据库具有具有不同主键的重复条目(关于equals和hashcode方法) 是的,我知道如果我让PK不是自动生成的,如果我使用UUID,那么我就会实现我的目标。但我

在具有自动生成主键的实体上,是否有方法防止使用hibernate重复输入数据

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


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

在DB级别强制执行约束。如果没有这一点,就很难(不可能?)避免重复,尤其是如果你的应用程序是群集的。

在DB级别强制执行该约束。如果没有这一点,就很难(不可能?)避免重复,尤其是如果你的应用程序是集群的

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

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

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

因此Hibernate使用主键定义对象的标识

还是我做错了什么

现在还不清楚你将实现什么。如果希望Hibernate使用传入对象的状态更新数据库中的对象,则需要使用
merge()

另请参见:

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

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

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

因此Hibernate使用主键定义对象的标识

还是我做错了什么

现在还不清楚你将实现什么。如果希望Hibernate使用传入对象的状态更新数据库中的对象,则需要使用
merge()

另请参见:


数据库级别的主键应使用与应用程序级别的相等性测试相同的字段。如果您确实需要代理键(可能出于性能原因),请在这些字段上强制执行“唯一索引”,并让hibernate抛出和异常。

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