BAEL-6004 TRUNCATE table in Spring Data JPA (#13554)
This commit is contained in:
parent
75b6c41819
commit
c119a05849
|
@ -0,0 +1,22 @@
|
|||
package com.baeldung.spring.data.persistence.truncate;
|
||||
|
||||
import org.springframework.stereotype.Repository;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.PersistenceContext;
|
||||
import javax.persistence.Query;
|
||||
|
||||
@Repository
|
||||
public class EntityManagerRepository {
|
||||
|
||||
@PersistenceContext
|
||||
private EntityManager entityManager;
|
||||
|
||||
@Transactional
|
||||
public void truncateTable(String tableName) {
|
||||
String sql = "TRUNCATE TABLE " + tableName;
|
||||
Query query = entityManager.createNativeQuery(sql);
|
||||
query.executeUpdate();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
package com.baeldung.spring.data.persistence.truncate;
|
||||
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@Repository
|
||||
public class JdbcTemplateRepository {
|
||||
private final JdbcTemplate jdbcTemplate;
|
||||
|
||||
public JdbcTemplateRepository(JdbcTemplate jdbcTemplate) {
|
||||
this.jdbcTemplate = jdbcTemplate;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void truncateTable(String tableName) {
|
||||
String sql = "TRUNCATE TABLE " + tableName;
|
||||
jdbcTemplate.execute(sql);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
package com.baeldung.spring.data.persistence.truncate;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Table;
|
||||
import java.util.Objects;
|
||||
|
||||
@Entity
|
||||
@Table(name = MyEntity.TABLE_NAME)
|
||||
public class MyEntity {
|
||||
|
||||
public final static String TABLE_NAME = "my_entity";
|
||||
@Id
|
||||
@GeneratedValue
|
||||
private Long id;
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
MyEntity myEntity = (MyEntity) o;
|
||||
return Objects.equals(id, myEntity.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "MyEntity{" +
|
||||
"id=" + id +
|
||||
'}';
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
package com.baeldung.spring.data.persistence.truncate;
|
||||
|
||||
import org.springframework.data.jpa.repository.Modifying;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import javax.transaction.Transactional;
|
||||
|
||||
@Repository
|
||||
public interface MyEntityRepository extends CrudRepository<MyEntity, Long> {
|
||||
|
||||
@Modifying
|
||||
@Transactional
|
||||
// need to wrap in double quotes due to
|
||||
// spring.jpa.properties.hibernate.globally_quoted_identifiers=true backward compatibility
|
||||
// property disabled in tests
|
||||
@Query(value = "truncate table " + MyEntity.TABLE_NAME, nativeQuery = true)
|
||||
void truncateTable();
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package com.baeldung.spring.data.persistence.truncate;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.autoconfigure.domain.EntityScan;
|
||||
|
||||
@EntityScan(basePackageClasses = MyEntity.class)
|
||||
@SpringBootApplication
|
||||
public class TruncateSpringBootApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(TruncateSpringBootApplication.class);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
package com.baeldung.spring.data.persistence.truncate;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@SpringBootTest(classes = TruncateSpringBootApplication.class,
|
||||
properties = "spring.jpa.properties.hibernate.globally_quoted_identifiers=false")
|
||||
class TruncateIntegrationTest {
|
||||
|
||||
@Autowired
|
||||
private MyEntityRepository myEntityRepository;
|
||||
|
||||
@Autowired
|
||||
private JdbcTemplateRepository jdbcTemplateRepository;
|
||||
|
||||
@Autowired
|
||||
private EntityManagerRepository entityManagerRepository;
|
||||
|
||||
@Test
|
||||
void givenSomeData_whenRepositoryTruncateDate_thenNoDataLeft() {
|
||||
int givenCount = 3;
|
||||
givenDummyData(givenCount);
|
||||
|
||||
myEntityRepository.truncateTable();
|
||||
|
||||
assertThat(myEntityRepository.count())
|
||||
.isNotEqualTo(givenCount)
|
||||
.isZero();
|
||||
}
|
||||
|
||||
@Test
|
||||
void givenSomeData_whenEntityManagerTruncateDate_thenNoDataLeft() {
|
||||
int givenCount = 3;
|
||||
givenDummyData(givenCount);
|
||||
|
||||
entityManagerRepository.truncateTable(MyEntity.TABLE_NAME);
|
||||
|
||||
assertThat(myEntityRepository.count())
|
||||
.isNotEqualTo(givenCount)
|
||||
.isZero();
|
||||
}
|
||||
|
||||
@Test
|
||||
void givenSomeData_whenJDBCTemplateTruncateDate_thenNoDataLeft() {
|
||||
int givenCount = 3;
|
||||
givenDummyData(givenCount);
|
||||
|
||||
jdbcTemplateRepository.truncateTable(MyEntity.TABLE_NAME);
|
||||
|
||||
assertThat(myEntityRepository.count())
|
||||
.isNotEqualTo(givenCount)
|
||||
.isZero();
|
||||
}
|
||||
|
||||
private void givenDummyData(int count) {
|
||||
List<MyEntity> input = Stream.generate(this::givenMyEntity).limit(count).collect(Collectors.toList());
|
||||
myEntityRepository.saveAll(input);
|
||||
}
|
||||
|
||||
private MyEntity givenMyEntity() {
|
||||
return new MyEntity();
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue