Действительно ли метод сохранения JPA Repositry в springboot фиксирует? - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь решить очень простую проблему, используя среду начальной загрузки, в которой я использую репозиторий JPA для некоторых базовых функций, где я использую метод save для сохранения сведений о классе person в базе данных H2 в памяти, ноЯ понял, что сохранение на самом деле не фиксирует данные, так как я не могу получить детали после того, как я отскочил от приложения весенней загрузки.Перед отскоком и в том же сеансе, если я попытаюсь получить детали данных, которые были сохранены с помощью метода сохранения, я смогу извлечь эти детали.ПОЖАЛУЙСТА, предложите, действительно ли метод сохранения фиксируется или нет?Я попытался добавить свойство в application.properties, чтобы каждый раз создавать новые записи.spring.jpa.hibernate.ddl-auto = update Но все равно не повезло

Класс сущности: -> пакет 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 голосов
/ 16 июня 2019

Метод save не фиксирует, он просто вызывает EntityManager.merge, который даже не выполняет сброс. Это означает, что в зависимости от состояния экземпляра вашей сущности он может вообще не касаться базы данных.

Обработка транзакций является ортогональной задачей и в стандартной установке Spring контролируется аннотациями @Transactional. Spring будет (снова в случае по умолчанию) зафиксировать транзакцию, когда вернется самый аннотированный метод. Это вызовет сброс изменений в базу данных с последующей фиксацией.

Метод save имеет такую ​​аннотацию, и поэтому Spring создаст вокруг него транзакцию, если нет других Transactional аннотаций.

Подробнее о Управление транзакциями Springs

Примечание: save - это метод из Spring Data, а не Spring Boot

...