Spring Boot 2.7.5 Springboot-JpaRepository和CrudRepository没有在数据库中保存相同的实体

eqqqjvef  于 2023-04-30  发布在  Spring
关注(0)|答案(1)|浏览(138)

在升级到Spring 2之后,我在尝试保存同一个实体(即使没有更改其属性)时遇到了数据完整性异常。7.5.具体来说,我看到一个与数据重复或主键约束相关的错误。
使用 Spring Boot 2时,该问题不可重现。6.5.
如何排除故障并解决此问题?
输入:

  • DB:mariaddb:10.3
  • Spring Boot :2.7.5
  • 依赖项:
  • org.springframework. Boot :Spring Boot
  • org.springframework. Boot :spring-boot-autoconfigure
  • org.springframework. Boot :spring-boot-starter-web
  • org.springframework. Boot :spring-boot-starter-data-jpa
  • org.mariadb.jdbc:mariadb-java-client
  • org.flywaydb:flyway-core

调试和启用hibernate日志时:

  • Spring Boot 2.7.5:Hibernate: insert into customers (....
  • Spring Boot 2.6.5:Hibernate: update customers set ....

验证码:

...
@Autowired
private CustomerRepository customerRepository;    
...
Optional<Customer> customer = customerRepository.findByEmail(email);
if (customer.isPresent()) {
   customerRepository.save(customer.get());
} else {
   Customer custom = new Customer();
   custom.setEmail(email);
   customerRepository.save(custom);          
}
...

StackTrace:

Caused by: java.sql.SQLException: Duplicate entry 'dummy@gmail.com' for key 'PRIMARY'
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readErrorPacket(AbstractQueryProtocol.java:1674)
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1536)
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:1499)
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:318)
    ... 80 common frames omitted

我尝试将依赖项的版本与Sping Boot 2对齐。7.5.

lkaoscv7

lkaoscv71#

使用保存方法插入新数据。
使用update方法更新数据。
当需要合并这两个时,使用merge方法。当数据不存在时插入它,当它存在时更新它。
你会得到重复的关键字异常,因为数据已经存在,可能hibernate在版本之间改变了它的实现(如果你愿意的话,在他们的文档中检查一下)

相关问题