h2 VS spring.jpa.hibernate.use-new-id-generator-mappings

时间:2017-09-17 22:18:24

标签: hibernate spring-boot h2

我们有一个spring boot(v 1.5.2)项目设置,带有一个用于本地开发的h2内存数据库。由于这是一个非常新的项目,我们没有遗留代码(还有..)到handle legacy id-generators。所以我们设置了spring.jpa.hibernate.use-new-id-generator-mappings: true

通过提供src/main/resources/data.sql,我们添加了一些初始数据。该文件除了insert命令之外什么都不包含,请说实体A

我们的实体配置了以下id生成器:​​

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

但是,当尝试存储另一个条目(即aRepo.save(newA))时,这会导致以下错误。

Caused by: org.h2.jdbc.JdbcSQLException: Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.A(ID)"; SQL statement:
insert into a (something, id) values (?, ?)

设置spring.jpa.hibernate.use-new-id-generator-mappings: false或不插入初始数据都可以解决问题。但是,我们宁愿理解为什么上述配置不起作用以及我们是否可以使其工作?

提前致谢! : - )

1 个答案:

答案 0 :(得分:0)

Hibernate只为每个条目维护会话。请检查您关闭服务中上一个会话的天气。不是意味着关闭并刷新你的会话。

您的数据库连接未正确关闭。

@Autowired
SessionFactory sessionFactory;
public <return Type> serviceFunction() { 
  session.save(newA);
  session.flush();
  session.close();
}

您需要关闭每个会话,否则模型类无法更改您的Id。它保持不变。 希望它会对你有所帮助。