【问题标题】:Does the save method of JPA Repositry in springboot actually commit?spring boot中JPARepository的save方法真的commit了吗?
【发布时间】:2019-10-30 04:34:02
【问题描述】:

我正在使用 Spring Boot 框架尝试一个非常基本的问题,其中我使用 JPA Repository 来实现一些基本功能,其中我使用 save 方法将 person 类的详细信息保存在内存数据库 H2 中,但是我发现 save 实际上并没有提交数据,因为在我反弹 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));
    }
}

【问题讨论】:

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


    【解决方案1】:

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

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

    save 方法有这样一个注解,因此如果没有其他 Transactional 注解存在,Spring 将围绕它创建一个事务。

    阅读更多关于Springs Transaction Management

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

    【讨论】:

    • 请分享我如何提交的任何示例
    猜你喜欢
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2023-01-30
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多