Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagejava
themeEmacs
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
titleSQL문 Trace

Hibernate:
/* insert com.example.demo.data.Address2
*/ insert
into
Address2
(address, age, name, phoneNbr, sex)
values
(?, ?, ?, ?, ?)


Hibernate:
select
address2x0_.ADDRESS_ID as ADDRESS_1_1_0_,
address2x0_.address as address2_1_0_,
address2x0_.age as age3_1_0_,
address2x0_.name as name4_1_0_,
address2x0_.phoneNbr as phoneNbr5_1_0_,
address2x0_.sex as sex6_1_0_
from
Address2 address2x0_
where
address2x0_.ADDRESS_ID=?


Hibernate:
/* load com.example.demo.data.Address2 */ select
address2x0_.ADDRESS_ID as ADDRESS_1_1_0_,
address2x0_.address as address2_1_0_,
address2x0_.age as age3_1_0_,
address2x0_.name as name4_1_0_,
address2x0_.phoneNbr as phoneNbr5_1_0_,
address2x0_.sex as sex6_1_0_
from
Address2 address2x0_
where
address2x0_.ADDRESS_ID=?


Hibernate:
/* delete com.example.demo.data.Address2 */ delete
from
Address2
where
ADDRESS_ID=?



코드분석:

  • 단지 '@Transactional' 어노테이션을 함수에 선언함으로, 어플리케이션에서 발생하는 예외까지 트랜젝션 과정에 포함시켜, 자동 롤백을 시킬수가 있습니다.
  • 기존 SQL/SP개발 방식에서는 하나의 함수에 즉각적인 삽입과 삭제가이루어 졌을것입니다. 하지만 지연쓰기방식은 변경점을 조사하여 변경이 없는 부분은 SQL문을 수행하지 않습니다.
  • 즉 , 실제 DB에 반영하는 flush() 타임시 변경점만을 반영을 합니다. 


장점요약:

  • 예외에대한 트랜젝션처리가 간단해집니다.
  • 변경점만 반영됨으로, 불필요한 쿼리호출을 방지할수 있으며 이것은 OOP접근만으로 작동이 가능합니다.
  • 이와같은 혼합처리를 위해 SP개발에서는 여러개의 단위 SP를 만들어야할것입니다. 또한 SQL문은 반복적으로 여러개 준비되어야할것입니다. 이것은 트랜젝션이 분리되고 복잡해짐을 의미합니다.