在升级到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.
1条答案
按热度按时间lkaoscv71#
使用保存方法插入新数据。
使用update方法更新数据。
当需要合并这两个时,使用merge方法。当数据不存在时插入它,当它存在时更新它。
你会得到重复的关键字异常,因为数据已经存在,可能hibernate在版本之间改变了它的实现(如果你愿意的话,在他们的文档中检查一下)