Hibernate 使用JPA方法通过单个查询插入多个记录
我有一个spring boot应用程序,我想使用一个DB查询插入多个记录:-Hibernate 使用JPA方法通过单个查询插入多个记录,hibernate,jpa,spring-data-jpa,spring-data,Hibernate,Jpa,Spring Data Jpa,Spring Data,我有一个spring boot应用程序,我想使用一个DB查询插入多个记录:- public void addEvents() { String sql = "INSERT INTO Data values(1,'Data 1'), (2,'Data 2'),(3,'Data 3')"; EntityManager entityManager = entityManagerFactory.createEntityManager(); entityMa
public void addEvents() {
String sql = "INSERT INTO Data values(1,'Data 1'), (2,'Data 2'),(3,'Data 3')";
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.createNativeQuery(sql).executeUpdate();
entityManager.getTransaction().commit();
}
实体类:-
@Entity
@Table
public class Data {
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
public Data(String name) {
this.name = name;
}
public Data(Integer id, String name) {
this.id = id;
this.name = name;
}
public Data() {
}
}
这里的数据是我正在插入的一个实体。我需要在几秒内在数据库中插入10000多行。因此,触发单个DB调用的成本太高。因此,我为此使用了一个查询。此查询是本机查询。有人能告诉我JPA是否提供了一个现成的API来在一个DB cl中插入多个实体吗?您可以使用spring数据的saveAll方法进行批量插入。下面是一段代码片段
List<Data> dataList = <10000 records> //You need to prepare batch of 10000
dataRepository.saveAll(dataList) //Spring boot will handle batches automatically.
您可以使用spring.jpa.show sql查看生成的查询
更新:
在pom.xml中添加以下依赖项
<dependency>
<groupId>com.integralblue</groupId>
<artifactId>log4jdbc-spring-boot-starter</artifactId>
<version>1.0.2</version>
</dependency>
蓝色
log4jdbc弹簧引导启动器
1.0.2
如果批处理正在进行或没有进行,则上述依赖关系将显示在日志中。您可以使用spring数据的saveAll方法进行批量插入。下面是一段代码片段
List<Data> dataList = <10000 records> //You need to prepare batch of 10000
dataRepository.saveAll(dataList) //Spring boot will handle batches automatically.
您可以使用spring.jpa.show sql查看生成的查询
更新:
在pom.xml中添加以下依赖项
<dependency>
<groupId>com.integralblue</groupId>
<artifactId>log4jdbc-spring-boot-starter</artifactId>
<version>1.0.2</version>
</dependency>
蓝色
log4jdbc弹簧引导启动器
1.0.2
如果批处理正在进行或未进行,上述依赖关系将显示在日志中。您可以在此处添加实体类吗?@ShaunakPatel-已添加请立即检查我建议您应该使用批处理作业来处理此情况。在服务器不忙的时候(用户流量较少的时候)运行批处理作业以插入这些记录。您可以在此处添加您的实体类吗?@ShaunakPatel-Added请立即检查我建议您应该使用批处理作业来处理此情况。在服务器不忙的时候(用户流量较少的时候)运行批处理作业以插入这些记录。在这里,我可以看到正在触发1000个sql查询。当我尝试插入2个数据记录时,将触发以下4个查询:-Hibernate:选择data0\u.id作为id1\u 0\u,data0_u0.id=?中的data0_0.name作为name2_0_0_uu来自data0_u其中data0_0.id=?Hibernate:调用Hibernate\u序列的下一个值Hibernate:从数据data0中选择data0\u.id作为id1\u 0\u,data0\u.name作为name2\u 0\u,其中data0\u.id=?Hibernate:调用Hibernate的下一个值\u顺序Hibernate:插入数据(名称,id)值(?),Hibernate:插入数据(名称,id)值(?),您可以在公共存储库中添加代码吗?我想看看。你可以在这里检查代码-m@Sunny,批处理已经发生了,但在日志中看不到。我已使用批处理启用更新了我的答案以显示行为。在这里,我可以看到正在激发1000个sql查询。当我尝试插入2个数据记录时,以下4个查询被激发:-Hibernate:选择data0.id作为id1\u 0\u 0,data0\u.name作为name2\u 0\u 0\u来自data0\u其中data0\u.id=?Hibernate:调用Hibernate\u序列的下一个值Hibernate:从数据data0中选择data0\u.id作为id1\u 0\u,data0\u.name作为name2\u 0\u,其中data0\u.id=?Hibernate:调用Hibernate的下一个值\u顺序Hibernate:插入数据(名称,id)值(?),Hibernate:插入数据(名称,id)值(?),您可以在公共存储库中添加代码吗?我想看看。你可以在这里检查代码-m@Sunny,批处理已经发生了,但在日志中看不到。我已更新我的答案,以显示批处理启用的行为。