package com.ankurm.hibernatedemo; import static org.assertj.core.api.Assertions.assertThat; import com.ankurm.hibernatedemo.model.WidgetIdentity; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import org.hibernate.SessionFactory; import org.hibernate.stat.Statistics; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; /** * Backs ankurm.com post 4861. Docs: docs/03-inserting-objects.md. * Run with {@code ./mvnw -Dtest=IdentityBatchTest test}. */ @SpringBootTest class IdentityBatchTest { private static final int ROW_COUNT = 30; @Autowired private EntityManagerFactory emf; @Test void identityGeneratorDisablesBatching_despiteBatchSizeBeingSet() { SessionFactory sessionFactory = emf.unwrap(SessionFactory.class); Statistics stats = sessionFactory.getStatistics(); stats.clear(); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); for (int i = 1; i <= ROW_COUNT; i++) { em.persist(new WidgetIdentity("identity-" + i)); } em.getTransaction().commit(); em.close(); assertThat(stats.getEntityInsertCount()).isEqualTo(ROW_COUNT); assertThat(stats.getPrepareStatementCount()) .as("with GenerationType.IDENTITY, hibernate.jdbc.batch_size has nothing to batch -- " + "every insert is its own round trip because the generated key is only " + "known after the row is written") .isEqualTo(ROW_COUNT); } }