首頁  >  文章  >  Java  >  如何在Hibernate中執行批次插入更新操作?

如何在Hibernate中執行批次插入更新操作?

WBOY
WBOY轉載
2023-08-27 23:17:061336瀏覽

如何在Hibernate中執行批次插入更新操作?

在本文中,我們將看到如何在Hibernate中執行批次插入/更新。

每當我們執行一條sql語句時,我們都是透過對資料庫進行網路呼叫來完成的。現在,如果我們必須向資料庫表中插入 10 個條目,那麼我們必須進行 10 次網路呼叫。相反,我們可以透過使用批次來優化網路呼叫。批次允許我們在單一網路呼叫中執行一組 SQL 語句。

為了理解並實作這一點,讓我們定義我們的實體−

@Entity
public class Parent {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private long id;
   private String name;
   // Getters
   //Setters
}

為了在Hibernate中啟用批次處理,我們需要在我們的應用程式中新增一個屬性

properties檔案:

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

現在,我們需要執行EntityManager的persist函數將資料插入資料庫

範例

@Autowired
private EntityManager entityManager;
@Test
Public void InsertInBatch(){
   for (int i = 0; i < 6; i++) {
      Parent parent = Parent[i];
      entityManager.persist(parent);
   }
}

輸出

"batch":true, "querySize":1, "batchSize":3, "query":["insert into parent (name, id) values (?, ?)"], "params":[["P1","1"],["P2","2"],["P3","3"]]
"batch":true, "querySize":1, "batchSize":3, "query":["insert into parent (name, id) values (?, ?)"], "params":[["P4","4"],["P5","5"],["P6","6"]]

從控制台我們可以看到,插入父表的操作是在批次大小為3的情況下進行的。

在持久化實體時,可能會發生OutOfMemoryException,因為Hibernate將實體儲存在持久化上下文中。因此,出於最佳化目的,我們可以在每批之後使用實體管理器的flush()和clear()。

批次更新意味著在一次網路呼叫中更新大量資料。

對於批次更新,流程是相同的。我們需要在應用程式屬性檔案中新增以下兩個語句,然後執行更新過程。

spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.batch_versioned_data=true

範例

更新資料的程式碼−

@Autowired
private EntityManager entityManager;
@Test
public void UpdateInBatch() {
   TypedQuery<Parent> query = entityManager.createQuery("SELECT p from Parent p", Parent.class);
   List<Parent> Parents = query.getResultList();
   int i=1;
   for (Parent parent : Parents) {
      String s="Parent"+Integer.toString(i);
      i++;
      parent.setName(s);
   }
}

Hibernate 現在會將這些語句綁定在一個批次中並執行它們。

輸出

"batch":true, "querySize":1, "batchSize":3, "query":["update parent set name=? where id=?"], "params":[["Parent1","1"],[" Parent2","2"],[" Parent3","3"]]
"batch":true, "querySize":1, "batchSize":3, "query":["update parent set name=? where id=?"], "params":[["Parent4","4"],["Parent5","5"],["Parent6","6"]]

從控制台可以看到,父表中的資料更新是在批次大小為3的情況下進行的。

以上是如何在Hibernate中執行批次插入更新操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除