728x90
- 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 |
---|