gpt4 book ai didi

java - Spring Data JPA - save() 方法在不使用返回实体的情况下工作得很好

转载 作者:行者123 更新时间:2023-12-02 02:52:59 27 4
gpt4 key购买 nike

下面是 Spring Data JPA 中 save() 方法的具体 Javadoc

/**
* Saves a given entity. Use the returned instance for further operations as the save operation might have changed the
* entity instance completely.
*
* @param entity
* @return the saved entity
*/
<S extends T> S save(S entity);

下面的资源清楚地表明我们需要使用返回的对象来确保我们对保存的实体执行进一步的操作。

Why to use returned instance after save() on Spring Data JPA Repository?

但是,在我的下面的代码中,我的 save() 实体可以正常工作,无需

public void createEmployee(Employee employee) throws Exception {
try {
employee.setEmployeeName("alan");
employeeRepo.save(employee);
employee.setEmployeeType("Permanent");
employeeRepo.save(employee);
} catch (Exception e) {
throw new Exception(e);
}

}
  1. 为什么上面的代码在没有返回类型的情况下也能工作
  2. 测试似乎表明数据保存得非常好,但我的印象是我们需要使用返回的实体来确保正确的持久性。

我是否无意中做了一些正确/错误的事情?我是 spring-data 的新手,希望完全理解 save() 方法,因为我当前的许多应用程序都是基于 CRUD 的。谢谢。

最佳答案

SimpleJpaRepository的save()方法如下:

/*
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#save(java.lang.Object)
*/
@Transactional
public <S extends T> S save(S entity) {

if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}

对于新的实体实例,它实际上并不重要,因为 save() 方法返回相同的实例。

请注意(假设您在服务层有一个 Activity 事务)即使没有第二次调用 save() 作为对 save() 的初始调用,您的代码也应该可以工作code> 将委托(delegate)给 EntityManager.persist() ,这将使员工实例得到管理和跟踪:对 Activity 事务中的实体所做的任何更改都将在事务提交时自动刷新到数据库(请参阅进一步内容) : http://www.objectdb.com/java/jpa/persistence/managed )。

public void createEmployee(Employee employee) throws Exception {
try {
employee.setEmployeeName("alan");
employeeRepo.save(employee);
employee.setEmployeeType("Permanent");
//employeeRepo.save(employee); <- not required : type should still be 'Permanent' in DB.
} catch (Exception e) {
throw new Exception(e);
}

}

关于java - Spring Data JPA - save() 方法在不使用返回实体的情况下工作得很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43519210/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com