Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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会话的细微差别_Java_Sql_Database_Spring_Hibernate - Fatal编程技术网

Java Hibernate会话的细微差别

Java Hibernate会话的细微差别,java,sql,database,spring,hibernate,Java,Sql,Database,Spring,Hibernate,我的问题是关于hibernate的——假设您有两个对象正在排队保存到数据库中。这些对象对于每个字段都具有完全相同的值。我的hibernate配置为在50次查询后自动刷新,因此假设它不会在进入hibernate会话后立即将这些对象刷新到数据库中。hibernate会将这些对象中的每一个作为不同的实体保存到数据库中(因此它会将重复记录保存为“不同的”记录),或者它是否识别出这些对象具有完全相同的值,并且只将这些镜像对象的一个实例保存到数据库中?数据库中是否有一个或两个实体取决于equals()的实现

我的问题是关于hibernate的——假设您有两个对象正在排队保存到数据库中。这些对象对于每个字段都具有完全相同的值。我的hibernate配置为在50次查询后自动刷新,因此假设它不会在进入hibernate会话后立即将这些对象刷新到数据库中。hibernate会将这些对象中的每一个作为不同的实体保存到数据库中(因此它会将重复记录保存为“不同的”记录),或者它是否识别出这些对象具有完全相同的值,并且只将这些镜像对象的一个实例保存到数据库中?

数据库中是否有一个或两个实体取决于equals()的实现(分别是hashcode)。如果对象被视为相等,则最终将得到一个实体,但如果对象不相等,则最终将得到两个实体

使用自动生成的代理关键点时必须格外小心:在首次保存对象之前,尚未指定关键点。因此,任何equals()实现都不能依赖于键相等。您必须确保处理此特殊情况

我的问题是关于hibernate的——假设您有两个 您正在排队保存到数据库

让我们换一种说法——我们有两个实体要在数据库中持久化

这些对象对于每个字段都具有完全相同的值

在Java中,有一个由
equals
(和
hashcode
)实现的对象标识。在数据库中有行标识-主键,它标识唯一的行(转换为唯一实例)。当我们将实体的实例映射到表中的行时,区分同一类(同一实体)的两个实例的方法是为每个实例提供唯一的主键。在JPA(Hibernate是JPA的实现)中,您需要使用
@Id
注释对字段(实体的属性)进行注释,这样它就可以被唯一标识

下面的类是具有唯一ID的实体类

@Entity
public MyClass

@Id
@GeneratedValue
private Long id;

您可以在每次保存时提供唯一的ID,也可以使用自动生成
@GeneratedValue
。根据基础数据库的不同,有不同的生成策略。

它们是否有Id字段以及它们的值是什么?Id字段由hibernate按顺序生成和处理。字段值是CLOB和字符串。它们在保存时的值是什么?我根本没有得到记录的多个副本,如果有,我只得到一个副本。在这过程中的某个地方我丢失了记录,我不明白为什么。我也有log4j设置,它为每个记录生成输出,这些记录也应该保存到数据库中。请向我们展示您的代码,也向我们展示您的表结构好的,因此,由于我没有为这些对象实现equals或hashcode,我的假设可能是正确的——hibernate将对象视为副本,因此只将一个副本保存到db中?我认为这是不正确的,默认行为是检查对象是否引用同一个对象,不是吗?事实并非如此,它们是占用不同内存位置的不同对象。是的,equals()的默认实现是当且仅当它们相同(x=y)时才返回true。如果您已经创建了实体的两个实例,那么最终将在数据库中创建两个实体(=行)。但是,如果对象相同,则将它们添加到会话中两次将只产生一个实体。是否确实要创建两个实例?您丢失数据的一个原因可能是您正在重用和实例,并在将其添加到会话之前应用新值。它们有一个Id对象字段,该字段用JPA注释进行注释。我让hibernate处理id创建,因为它由序列数据库端填充。但我正在丢失记录,它们不再存在。请提供更多信息,说明如何持久化以及如何控制事务。我提供这些信息只是为了表明Java标识对JPA并不重要,它有自己的标识理解。AOP spring transaction management,保存对象的方法使用@Transactional标记进行注释,隔离级别为serializable。我使用的是Spring Data JPA,因此我甚至无法管理对象何时会持久化,如果我的理解正确,该功能将从我这里抽象出来-我将对象保存在JPA存储库中。请发布配置和类,没有它们很难理解(至少对我来说:)