Database/JPA 5

JPA 영속성 컨텍스트

JPA 영속성 컨텍스트영속성 컨텍스트영속성 컨텍스트란 엔티티를 영구로 저장하는 환경(context)라는 의미이다영속성 컨텍스트 개념을 구현한게 entity manger이라고 생각을 하면 된다.영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다. 따라서 영속 상태는 식별자 값이 반드시 있어야 한다. 없으면 예외가 발생한다.영속성 컨텍스트에 엔티티를 저장하면 이 엔티티는 언제 저장이 될까?JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영하는데 이를 플러시(flush)라 한다.영속성 컨텍스트가 엔티티를 관리하면 다음과 같은 장점이 있다.1차 캐시동일성 보장트랜잭션을 지원하는 쓰기 지연변경 감지지연 로딩엔티티의 생명주기비영속성(new/transient) : 영속성 ..

Database/JPA 2018.09.08

JPA CascadeType

JPA CascadeTypeJPA에서 연관관계(@OneToMany, @ManyToOne) 에 부모 엔티티와 자식 엔티티에 대한 영속성 처리에 대한 설정을 할수가 있다.CascadeType.RESIST 엔티티를 생성하고, 연관 엔티티를 추가하였을 때 persist() 를 수행하면 연관 엔티티도 함께 persist()가 수행된다. 만약 연관 엔티티가 DB에 저장이 되어있으면 다시하며 persist 를 하는 것이기때문에 detached entity passed to persist Exception이 발생한다.이경우에는 CascadeType.MERGE를 사용한다.CascadeType.MERGE트랜잭션이 종료되고 detach 상태에서 연관 엔티티를 추가하거나 변경된 이후에 부모 엔티티가 merge()를 수행하게 ..

Database/JPA 2018.09.08

@ EnableTransactionManagement Advice Mode PROXY와 ASPECTJ

낙관적 Lock (Optimistic Lock)을 이용해서 비즈니스 로직을 처리를 할때 클래스의 내부의 함수는 트랙잭션이 제대로 걸리지 않아 데이터가 저장이 되지 않았었다. 이와 관련해서 stackoverflow에 검색을 해보니 관련되서 질문을 올린 사람이 있었다. 관련해서는 실수를 하기 쉬운 것이라고 생각이 되서 블로그 글을 따로 정리를 한다.Option A@Transactional public void generate(){ // selects save(a); // more selects } @Transactional public void save(Object a){ //save the object }Option Bpublic void generate(){ // selects save(a); // mo..

Database/JPA 2018.06.03

Transactional with jpa repository

interface SampleRepository {} interfaces SampleJpaRepository implements JpaRepository, SampleRepository {} @Autowiredprivate SampleRepository sampleRepositry; - SampleRepositry라는 인터페이스를 두고 실제 SampleJpaRepository 구현체를 따로 두는 형식으로 구현을 할수가 있다.- 구조는 Domain Driven Design에서 인프라 설계부분 (여기에서는 JPA를 Infra라고 볼수 있다)을 인터페이스 두고 구현을 한 예제이다. 위의 코드는 비즈니스 로직을 작성을 할때 문제점이 발생이 될수가 있다.- 실제 Transaction은 SampleJpaRepost..

Database/JPA 2018.05.28

Database Transaction Lock With JPA

Database Transaction Lock With JPA데이터베이스의 Transaction Lock은 두가지 방식이 있다. 1. 낙관적 잠금- 다른 transaction이 수정이 할수가 있다.- version 컬럼을 두어 version 이 달라지는 경우 충돌을 알려준다.- JPA에서의 @Version 기능, 버전이 달라질 경우에는 OptimisticLockException 에러가 발생이 된다. @Lock Annotation- LockModeType.OPTIMISTIC- LockModeType.OPTIMISTIC_FORCE_INCREMENT - 업데이트가 되지 않는 경우에 강제로 version을 +1를 더한다. - 1:N의 구조의 데이터 인경우는 N에 해당하는 데이터를 추가할때 1에 해당하는 데이터가..

Database/JPA 2018.05.28