JPA
-
JPA @Transactional과 @RollbackJPA 2022. 1. 4. 18:30
스프링 @Transactional의 특징과 @Rollback 사용 스프링에서 제공하는 @Transactional은 기본적으로 커밋을 하지 않고 데이터를 롤백을 시킨다. 그렇게 되면 반복적인 테스트할 때 유용하다. 하지만 insert나 update 등의 쿼리문을 보기 위해선 데이터가 DB에 접근을 해야되는데 JPA 특성상 커밋을 하지 않으면 DB에 쿼리가 날라가지 않는다. 따라서, @Transactional을 사용하고 있을 때, DB 쿼리 문을 확인하고 싶으면 @Rollback(false)를 사용해주면 된다. (단, yml에 org.hibernate.type: trace을 선언하면 insert 문이 보이지 않는다.) @Rollback(value = false)
-
JPA flush()와 clear()JPA 2021. 12. 27. 17:41
flush()와 clear() JPA의 EntityManager는 persist, flush, clear 세가지 동작이 있는데 각각, persist(영속성 컨텍스트에 저장) flush()(영속성 컨텍스트에서 데이터를 DB까지 접근 시키지만 commit은 하지 않음) clear()(영속성 컨텍스트 안을 모두 지움) 와 같은 기능을 한다. DB 쿼리 문을 확인하고 싶을 때 flush와 clear를 선언해줘야 하는데, 그 이유는 flush로 DB에 접근하고 clear를 시켜줌으로써 영속성 컨텍스트를 비운다. 영속성 컨텍스트가 비었으므로 JPA는 DB에서 정보를 가져올 수 밖에 없다. 이를 이용해서 DB에서 날라오는 쿼리문을 확인할 수 있게 되는 것이다. JPA 특성상 바로 DB에 접근하지 않고 영속성 컨텍스트..
-
JPA 변경 감지와 병합(merge)JPA 2021. 12. 22. 16:46
JPA 변경 감지(dirty checking) 기본적으로 변경이 일어나면 database에 commit을 해준다. //JPA 변경 감지 Test @RunWith(SpringRunner.class) @SpringBootTest public class ItemUpdateTest { @Autowired EntityManager em; @Test public void updateTest() throws Exception { Book book = em.find(Book.class, 1L); //Transaction book.setName("changeName"); //데이터 변경 //변경 감지 == dirty checking //TX commit } }준영속 엔티티 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 ..
-