Hibernate 使用JPA方法通过单个查询插入多个记录

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

我有一个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();
        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,批处理已经发生了,但在日志中看不到。我已更新我的答案,以显示批处理启用的行为。