Spring Data Jpa Repository 未将实体保存到数据库

Posted

技术标签:

【中文标题】Spring Data Jpa Repository 未将实体保存到数据库【英文标题】:Spring Data Jpa Repository not saving entities to database 【发布时间】:2022-01-07 21:35:43 【问题描述】:

我在使用 jpa 时遇到了一些困难。我没有收到任何异常,但我无法将任何内容保存到数据库中。我从 Hibernate 转到 Jpa,那里一切正常。以下是我的文件

application.properties:

logging.level.org.springframework.web=DEBUG
logging.level.ch.generali=DEBUG
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=postgres
spring.datasource.password=1234
spring.datasource.url=jdbc:h2:mem:party;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=mysql
spring.jpa.hibernate.ddl-auto=update

型号:

@Getter
@Setter
@Builder
public class NewClientFormWrapper 
   //Entity
   NaturalPerson person;
   //Entity
   Address[] addresses;
   //Entity
   CommunicationChannel[] communicationChannels;


存储库:

public interface NaturalPersonRepository extends JpaRepository<NaturalPerson, Integer> 

    Optional<List<NaturalPerson>> getNaturalPersonByFirstname(String inputFirstname);

    Optional<NaturalPerson> getNaturalPersonById(int id);

    void deleteNaturalPersonById(int id);


服务:

@RestController
@RequestMapping("/partner")
public class PartnerService 

@Autowired
NaturalPersonRepository naturalPersonRepository;

@PostMapping(value = "/client")
@Transactional
public ResponseEntity<NewClientFormWrapper> newClient(@RequestBody @Valid NewClientFormWrapper 
request) 

    request.getPerson().setAddresses(Arrays.asList(request.getAddresses()));
    request.getPerson().setCommunicationChannels(Arrays.
       asList(request.getCommunicationChannels()));
    NaturalPerson naturalPerson = naturalPersonRepository.save(request.getPerson());

    NewClientFormWrapper response = NewClientFormWrapper.builder()
            .person(naturalPerson)
            .addresses(naturalPerson.getAddresses().toArray(new Address[0]))
            .communicationChannels(naturalPerson.getCommunicationChannels().toArray(new 
             CommunicationChannel[0]))
            .build();
    return ResponseEntity.ok(response);
    
  

提交表单时收到 200 响应,但在数据库中找不到数据

【问题讨论】:

您在哪里寻找数据? 在数据库中,你看我创建了一个带有表的用户界面,所有用户都显示在其中,创建后我可以在表中看到用户,但在数据库中看不到跨度> 【参考方案1】:

您使用的是运行时数据库 (H2),因此当您调用 APi 时,数据会从内存中显示。实际数据库中没有数据持久化。要将数据持久化到实际数据库中,您需要使用实际数据库 url 和驱动程序设置以下属性

spring.datasource.url=jdbc:h2:mem:party;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL
spring.datasource.driver-class-name=org.h2.Driver

【讨论】:

成功了!由于我使用的是 postgres,因此我还将驱动程序更改为 postgres。

以上是关于Spring Data Jpa Repository 未将实体保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

spring-data-jpa 和 spring-boot-starter-data-jpa 的区别

spring-data详解之spring-data-jpa:简单三步快速上手spring-data-jpa开发

spring data jpa怎么和solr整合

spring data jpa问题

Spring Data 系列 Spring+JPA(spring-data-commons)

spring-data-jpa软删除方案