在jpa.properties.hibernate.id.new_generator_mappings:true时使用不推荐的[org.hibernate.id.SequenceGenerator]和唯一的constratint违规

Can*_*ell 2 hibernate jpa

升级到Hibernate 5后,我收到了错误消息Found use of deprecated [org.hibernate.id.SequenceGenerator].我发现这个答案有一个代码片段,提到如何解决问题.

  • 我想知道该解决方案的工作原理.该代码片段是否与@SequenceGenerator注释做同样的事情?如果是这样,为什么被SequenceGenerator弃用?

  • 我的注释来自javax.persistence包装.我宁愿不在我的代码中添加特定于hibernate的东西.在我已经链接的答案中strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",,依赖于hibernate(至少在运行时).有没有办法实现这个目标?

  • 当我设置时,hibernate.id.new_generator_mappings:true我得到唯一约束违规错误

Can*_*ell 6

要回答我自己的问题,

上面的弃用警告是因为Spring Boot 1.5设置 jpa.properties.hibernate.id.new_generator_mappings: false.如果设置为true,Hibernate将在内部使用,SequenceStyleGenerator并且警告不会出现.

但是为了获得序列的下一个值而执行的逻辑会有所不同.

  • 将上面的设置设置为false,org.hibernate.id.SequenceGenerator就会使用,而且这似乎没有使用allocationSize参数@SequenceGenerator.它将始终调用数据库以获取序列的下一个值.还有另一个SequenceHiLoGenerator来自其javadoc的引用,An IdentifierGenerator that combines a hi/lo algorithm with an underlying oracle-style sequence that generates hi values.因此这可以与INCREMENT BY创建Orcale序列时一起使用,并且该生成器不会为每个插入调用数据库.

  • 将上面的设置设置为true,Hibernate默认使用PooledOptimizer哪个使用allocationSize参数.由于生成ID的方式不同,我得到了唯一约束违规错误.

  • 对于Spring Boot,属性为:spring.jpa.properties.hibernate.id.new_generator_mappings = true (2认同)