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开发