我正在尝试使用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));
}
}
答案 0 :(得分:0)
save
方法不会提交,它仅调用EntityManager.merge
,它甚至不执行刷新操作。
这意味着根据您的实体实例的状态,它可能根本不会接触数据库。
在@Transactional
注释控制的标准Spring设置中,事务的处理是一个正交的问题。
当最外层带注释的方法返回时,Spring将(同样在默认情况下)提交事务。
这将触发对数据库的更改刷新,然后进行提交。
save
方法具有这样的注释,如果没有其他Transactional
注释,Spring将在其周围创建事务。
详细了解Springs Transaction Management
注意:save
是Spring Data的方法,不是Spring Boot的方法