Вставка нескольких записей одним запросом с использованием методов JPA - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть приложение весенней загрузки, в которое я хочу вставить несколько записей, используя один запрос к БД: -

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() {
    }
}

Здесь Data - это сущность, которую я вставляю.Мне нужно вставить более 10000 строк в моей БД в течение секунд.Поэтому запуск отдельных вызовов в БД обходится слишком дорого.Поэтому я использовал один запрос для этой цели.Этот запрос является собственным запросом.Может кто-нибудь сказать мне, если JPA предоставляет готовый API для вставки нескольких сущностей в один кл БД?

1 Ответ

0 голосов
/ 29 апреля 2019

Вы можете использовать saveAll метод пружинных данных для массовой вставки. Вот фрагмент кода,

List<Data> dataList = <10000 records> //You need to prepare batch of 10000

dataRepository.saveAll(dataList) //Spring boot will handle batches automatically. 

Добавить следующие свойства в application.properties

spring.jpa.properties.hibernate.jdbc.batch_size=100

Вы можете увидеть сгенерированный запрос, используя spring.jpa.show-sql

Обновление: Добавьте следующую зависимость в ваш pom.xml,

 <dependency>
     <groupId>com.integralblue</groupId>
     <artifactId>log4jdbc-spring-boot-starter</artifactId>
            <version>1.0.2</version>
 </dependency>

Выше зависимости будет отображаться в журнале, если пакет происходит или нет.

...