Spring Boot 2.0.0 迁移 - JPA 存储库保存问题

use*_*446 2 spring hibernate spring-data-jpa spring-boot hibernate-5.x

我刚刚将我的应用程序从 Spring Boot 1.3.3 迁移到 2.0.0.RELEASE 并做了大部分更改以使我的项目启动并运行。

但是,当我调用任何存储库的 save() 选项时,我遇到了一个问题。相同的结构和 DO 在 1.3.3 中运行良好。

每当我去保存(在任何存储库中)时,我都会收到以下错误:

org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert explicit value for identity column in table 'POLICY' when IDENTITY_INSERT is set to OFF.
Run Code Online (Sandbox Code Playgroud)

我的 PolicyDO 的 id 设置如下:

private @Id @GeneratedValue(strategy=GenerationType.AUTO,generator="policyId_seq) @SequenceGenerator(name="policyId_seq",sequenceName="POLICYID_SEQ",allocationSize=1) Long id;
Run Code Online (Sandbox Code Playgroud)

这是我的存储库的快照:

public interface PolicyRepository extends CrudRepository<PolicyDO, Long> { PolicyDO findByPolicyNum(String policyNum); PolicyDO findByProposalNum(String proposalNum); }
Run Code Online (Sandbox Code Playgroud)

我一直在谷歌搜索过去 2 个小时,但找不到通过配置或注释设置 IDENTITY_INSERT 的方法。任何人都可以帮助解决这个问题?我什至尝试将所有 ID 设置为 null,因此它必须在插入之前生成所有 ID,但仍然没有

小智 5

当我迁移到 2.0.0 时,我遇到了同样的问题。在调查了这个问题后,我意识到 DB 中的序列不能正常工作,所以我不得不调整设置。

我不知道为什么但是从 @GeneratedValue 注释中删除生成器并将策略类型更改为 IDENTITY 解决了这个问题。

在你的情况下,它看起来像:

private @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @SequenceGenerator(name="policyId_seq",sequenceName="POLICYID_SEQ",allocationSize=1) Long id;
Run Code Online (Sandbox Code Playgroud)