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规范的“正常”行为,我不希望其他实现会这样做。那里不应该有“脏”的东西(如您所说)。信息是有用的。但是,我的实际问题是,当对象未被方法修改时,为什么对象变脏。信息是有用的。但是,我的实际问题是,当对象未被方法修改时,为什么对象变脏。