springboot中的JPA Repository的save方法是否确实提交?

时间:2019-06-16 06:58:00

标签: hibernate spring-boot spring-mvc spring-data-jpa spring-data

我正在尝试使用Spring Boot框架解决一个非常基本的问题,在该问题中,我使用JPA存储库实现某些基本功能,在这里我使用save方法将person类的详细信息保存在内存数据库H2中,但是我发现保存实际上并没有提交数据,因为在弹跳spring-boot应用程序后无法检索详细信息。在弹跳之前和在同一会话中,如果我尝试获取使用save方法保存的数据的详细信息,则可以检索这些详细信息。 请提出保存方法是否实际提交? 我试图在application.properties中添加一个属性,以确保每次都不会创建新记录。 spring.jpa.hibernate.ddl-auto =更新 但还是没有运气

实体类:->     包com.shubhmah.springbootapp.PersonDetails;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Data 
@Entity 
public class PersonDetails
{
    @Id
    @GeneratedValue
    private Long id;

    private String firstName;

    private String middleName;

    private String lastName;

    private String dateOfBirth;

    PersonDetails(){

    }

    PersonDetails(String firstName, String middleName, String lastName, String dateOfBirth){
        this.firstName=firstName;
        this.middleName= middleName;
        this.lastName= lastName;
        this.dateOfBirth=dateOfBirth;
    }
}

存储库类:->

package com.shubhmah.springbootapp.PersonDetails;

import org.springframework.data.jpa.repository.JpaRepository;

 interface PersonDetailsRepository extends JpaRepository<PersonDetails, Long> {
}

应用程序类:->

package com.shubhmah.springbootapp.PersonDetails;

import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController
public class PersonRestController {

    protected List<PersonDetails> personDetails;
    private  final PersonDetailsRepository personDetailsRepository;

    PersonRestController(PersonDetailsRepository pr){
        this.personDetailsRepository= pr;
    }
    @PostMapping("/person/savePerson")
    PersonDetails savePerson(@RequestBody PersonDetails personDetails){
        return  personDetailsRepository.save(personDetails);

    }
    @GetMapping("/person/getAllPerson")
    protected List<PersonDetails> getPersons(){
        personDetails = new ArrayList<>();
        personDetails = personDetailsRepository.findAll();
        return personDetails;
    }
    @GetMapping("/person/getSortedPerson")
    protected List<PersonDetails> getSortedDetails(@RequestParam String sort){
        return personDetailsRepository.findAll(Sort.by(sort));
    }
}

1 个答案:

答案 0 :(得分:0)

save方法不会提交,它仅调用EntityManager.merge,它甚至不执行刷新操作。 这意味着根据您的实体实例的状态,它可能根本不会接触数据库。

@Transactional注释控制的标准Spring设置中,事务的处理是一个正交的问题。 当最外层带注释的方法返回时,Spring将(同样在默认情况下)提交事务。 这将触发对数据库的更改刷新,然后进行提交。

save方法具有这样的注释,如果没有其他Transactional注释,Spring将在其周围创建事务。

详细了解Springs Transaction Management

注意:save是Spring Data的方法,不是Spring Boot的方法