JPA

[JPA] 객체 지향 쿼리 언어, JPA와 JDBC 같이 사용

yerimkoko 2022. 5. 19. 13:42
728x90

출처: 자바 ORM 표준 JPA 프로그래밍 (김영한 저)

  • JPQL: 엔티티 객체를 대상으로 쿼리, SQL을 추상화 해서 특정 데이터 베이스 SQL에 의존하지 않는다. → 결국 SQL로 변환된다.
  • Criteria: 표준 스펙에 들어간다. (실무에서 x → 유지보수 어려움) 권하지 않는다.
  • QueryDSL: JPQL 을 잘 사용하면 QueryDSL 은 금방 사용 가능하다. (실무 사용 권장)
    • 컴파일 시점에 문법 오류 찾을 수 있음
    • JPQL 빌더 역할
    • 자바코드로 JPQL 작성 가능
  • native SQL : JPA가 제공하는 SQL을 직접 사용하는 기능. 특정 데이터베이스에 의존적인 기능

 

 

flush 는 commit, query가 날라갈 때 실행이 된다. (기본적인 auto모드 전략, JPA 관련해서 쓸 때는 상관이 없다.)

JPA를 사용하면서 JDBC 커넥션을 직접 사용할 때에는

public static void main(String[] args) {
	EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
	EntityManager em = emf.createEntityManager();

	EntityTransaction tx = em.getTransaction();
	tx.begin();
	
	Member member = new Member();
	member.setName("yerimkoko");
	em.persist(member);
	
	// 이 시점에 플러시가 되지 않는다.
	
	dbconn.executeQuery(”select * from member”)
	// 이 시점에는 jpa가 아니기 때문에 flush가 일어나지 않는다. 
	// 결과가 나오게 나오게 하려면 em.flush()를 직접 호출해야 한다. (영속성 컨텍스트 수동 플러시)
	
	for (Member member : members() {
		System.out.println("member = ", member); 
	} // 결과 0
	
	tx.commit(); // jpa는 이 시점에 플러시가 된다.
}

이럴 경우 강제로 flush를 해 줘야한다.

 

JDBC 직접 사용 할 경우 (SpringJdbcTemplate 등등)

  • JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나, 스프링 JdbcTemplatem, myBatis
  • 등을 함께 사용 가능하다.
  • 단 영속성 컨텍스트를 필요한 시점에 강제로 플러시 필요하다.
  • ex) JPA를 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트 수동 플러시

'JPA' 카테고리의 다른 글

[JPA] cascade 옵션 & 고아 객체  (0) 2022.05.16