Page History
...
Code Block | ||||
---|---|---|---|---|
| ||||
public class AddressRepositoryImpl implements MyAddressRepository { @PersistenceContext private EntityManager em; @Override @Transactional public void addAddress() { //비영속( 단순하게 엔티티 객체만 생성함) Address2 address2 = new Address2(); address2.setName("영희"); address2.setSex("여"); address2.setAddress("서울/마포"); //엔티티 저장하고, 준영속화(분리함) em.persist(address2); em.detach(address2); // 첫번째 데이터를 찾아서 삭제대기... Address2 firstAddress = em.find(Address2.class, 1L ); em.remove(firstAddress); //엔티티를 다시 영속 관리객체로 복귀 em.merge(address2); //추가된 엔티티의 데이터가 변경되었음으로 변경감지. address2.setName("영희2"); //마지막 상태 Db반영(쓰기지연) em.flush(); //준영속 //em.detach(address2); //다시영속시킴 //em.merge(address2); //예외발생-롤백 //assertTrue(false); } |
Expand | ||
---|---|---|
| ||
Hibernate:
|
코드분석:
- 단지 '@Transactional' 어노테이션을 함수에 선언함으로, 어플리케이션에서 발생하는 예외까지 트랜젝션 과정에 포함시켜, 자동 롤백을 시킬수가 있습니다.
- 기존 SQL/SP개발 방식에서는 하나의 함수에 즉각적인 삽입과 삭제가이루어 졌을것입니다. 하지만 지연쓰기방식은 변경점을 조사하여 변경이 없는 부분은 SQL문을 수행하지 않습니다.
- 즉 , 실제 DB에 반영하는 flush() 타임시 변경점만을 반영을 합니다.
장점요약:
- 예외에대한 트랜젝션처리가 간단해집니다.
- 변경점만 반영됨으로, 불필요한 쿼리호출을 방지할수 있으며 이것은 OOP접근만으로 작동이 가능합니다.
- 이와같은 혼합처리를 위해 SP개발에서는 여러개의 단위 SP를 만들어야할것입니다. 또한 SQL문은 반복적으로 여러개 준비되어야할것입니다. 이것은 트랜젝션이 분리되고 복잡해짐을 의미합니다.