繁体   English   中英

Spring Data JPA-save()方法可以很好地工作而无需使用返回的实体

[英]Spring Data JPA - save() method working perfectly fine without using the returned entity

以下是特定于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);

并且在下面的资源中明确指出,我们需要使用返回的对象来确保对保存的实体执行进一步的操作。

为什么在Spring Data JPA Repository上的save()之后使用返回的实例?

但是,在下面的代码中,我的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()方法返回相同的实例。

需要注意的是(假设你有在服务层的活动事务),你的代码甚至应该工作,没有第二个呼叫到save()作为初始调用save()将委托给EntityManager.persist()这将使员工实例管理并跟踪:在活动事务中对实体所做的任何更改将在事务提交时自动刷新到数据库中(请参见: 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);
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM