Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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/2/spring/11.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 @事务性创建新的引用脏对象,即使它未被修改_Java_Spring_Hibernate_Jpa_Spring Data - Fatal编程技术网

Java @事务性创建新的引用脏对象,即使它未被修改

Java @事务性创建新的引用脏对象,即使它未被修改,java,spring,hibernate,jpa,spring-data,Java,Spring,Hibernate,Jpa,Spring Data,当在方法中使用@Transactional注释并且我们不修改域对象时,仍然会提交新对象的新引用 例如,让我们以一个示例案例为例: 域对象: @Table(name = "SAMPLE_TABLE") public class SampleTable{ @Column(name = "ID") String id; @Column(name = "FIRST_NAME") String firstName; @Column(name =

当在方法中使用
@Transactional
注释并且我们不修改域对象时,仍然会提交新对象的新引用

例如,让我们以一个示例案例为例:

域对象:

@Table(name = "SAMPLE_TABLE")
public class SampleTable{        
    @Column(name = "ID")
    String id;

    @Column(name = "FIRST_NAME")
    String firstName;

    @Column(name = "CITY")
    String city;

    @Column(name = "STREET_ADDRESS")
    private String streetAddress;
}
我有一个带有
@Transactional
注释的服务方法,但不修改域对象

@Transactional
public void doNothing(String id) {
    SampleTable sampleTable = sampleTableRepository.findById(id);       
}
因此,每当执行
doNothing
方法时,我都会看到域对象变脏,因为提交了一个新的引用,数据没有变化。(使用Hibernate拦截
findDirty
方法确认了这一点)。当我删除
@Transactional
时,这(脏对象)不会发生


这是Hibernate中的正常行为还是错误。

在Spring中有很多事务。值得向事务中添加您确信确实是只读的事务。

春季有很多for事务。值得向事务中添加您确信确实是只读的事务。

Hibernate应用策略(检查)来检测脏对象(例如,如果对象仍然是瞬态的,那么它总是脏的)。因此,为了避免脏检查,请使用只读注释(第5点:Hibernate中的另一件事,对于只读事务,Spring将FlushMode设置为MANUAL,这会导致其他优化,例如不需要脏检查。)

Hibernate应用策略(检查)来检测脏对象(例如,如果对象仍然是瞬态的,那么它总是脏的。)因此,为了避免脏检查,请使用只读注释(第5点:Hibernate时的另一件事,Spring将只读事务的FlushMode设置为MANUAL,这会导致其他优化,例如不需要脏检查。)

你也可以为
模型添加代码吗?我假设你没有覆盖spring存储库上的方法
findById
。你能确认吗?我删除了模型类。它只有一个生成的字符串id。我现在为现有类添加了id。我有一个方法SampleTable findById(字符串id);在我创建的接口SampleTableRepository中。我认为这是一个只读问题:请参阅@hasnae:您能详细说明一下吗?这不是JPA规范的“正常”行为,我不希望其他实现会这样做。那里不应该有“脏”的东西(如您所说)。您是否也可以添加
模型
的代码?我假设您没有覆盖spring存储库上的方法
findById
。您可以确认吗?我删除了模型类。它只是生成了一个字符串id。我现在将id添加到现有类中。我有一个方法示例findById(字符串id);在我创建的接口SampleTableRepository中。我认为这是一个只读问题:请参阅@hasnae:您能详细说明一下吗?这不是JPA规范的“正常”行为,我不希望其他实现会这样做。那里不应该有“脏”的东西(如您所说)。信息是有用的。但是,我的实际问题是,当对象未被方法修改时,为什么对象变脏。信息是有用的。但是,我的实际问题是,当对象未被方法修改时,为什么对象变脏。