Java Spring Boot JPA-是否可以使用IDENTITY generator或等效工具批量插入?
我最近发现了Spring Boot JPA 2.2.6和Mysql 8中的批插入 要使批插入工作正常,我必须更改以下内容:Java Spring Boot JPA-是否可以使用IDENTITY generator或等效工具批量插入?,java,mysql,spring,spring-boot,jpa,Java,Mysql,Spring,Spring Boot,Jpa,我最近发现了Spring Boot JPA 2.2.6和Mysql 8中的批插入 要使批插入工作正常,我必须更改以下内容: @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", unique = true, nullable = false) private long id; 致: 具有一些附加属性: spring: jpa: properties:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private long id;
致:
具有一些附加属性:
spring:
jpa:
properties:
hibernate:
generate_statistics: true
jdbc:
batch_size: 1000
order_inserts: true
order_updates: true
当我使用单个服务器实例进行测试时,批插入似乎可以正常工作。但我刚刚注意到,当有两个API实例时,id增量无法正常工作
似乎正在发生的是:
当我希望使用批插入时,如何防止在使用多个实例时引发重复密钥异常,同时确保每个新实体始终在多个实例中获取下一个可用的递增id?
GenerationType.IDENTITY
不允许批插入。例如,您可以看到这一点
事实上,当使用多个实例时,此代码将不起作用。因为策略增量
使用增量生成器
实现。在这里,您可以看到缓存了数据库中的最大ID值。因此,如果应用程序的另一个实例插入了一个值,那么当前实例将永远不会知道该值
要解决您的问题,您可以使用
@Id
@GeneratedValue
private UUID id;
或者您应该将数据库更改为PostgreSQL,然后必须使用sequence
策略
如果这些选项不适合您,您可以在
DefaultIdentifierGeneratorFactory
GenerationType中看到生成标识符的其他策略的实现。IDENTITY
不允许批量插入。例如,您可以看到这一点
事实上,当使用多个实例时,此代码将不起作用。因为策略增量
使用增量生成器
实现。在这里,您可以看到缓存了数据库中的最大ID值。因此,如果应用程序的另一个实例插入了一个值,那么当前实例将永远不会知道该值
要解决您的问题,您可以使用
@Id
@GeneratedValue
private UUID id;
或者您应该将数据库更改为PostgreSQL,然后必须使用sequence
策略
如果这些选项不适合您,您可以在
DefaultIdentifierGeneratorFactory
中看到生成标识符的其他策略的实现,您必须将其从long
更改为long
,因为primative不能为null,但long
可以为null。当您的id设置为null时,只要在数据库中正确设置,spring将自动获取下一个id,以增加id。您必须将其从long
更改为long
,因为primative不能为null,但long
可以。当您的id设置为null时,spring将自动获取下一个id,只要您在数据库中正确设置它以增加id。
@Id
@GeneratedValue
private UUID id;