ORM: 10개의 글
JPA - 영속성 컨텍스트와 JPQL 쿼리 후 영속 상태인 것과 아닌것 -JPQL의 조회 대상은 엔티티, 임베디드 타입, 값 타입 같이 다양하다. 하지만 엔티티를 조회하면 영속성 컨텍스트에 관리되지만 나머지는 관리되지 않는다. 예를 들어 임베디드 타입만 참조해서 조회했을 경우에 값을 변경해서 플러시 시점에 반영되지 않는다. 하지만 엔티티를 조회하여 엔티티가 가지고 있는 임베디드타입을 변경했을 경우에는 플러시 시점에 변경이 반영이 된다. JPQL로 조회한 엔티티와 영속성 컨텍스트 -JPQL로 데이터베이스에서 조회한 엔티티가 영속성 컨텍스트에 이미 있으면 JPQL로 데이터베이스에서 조회한 결과를 버리고 대신에 영속성 컨텍스트에 있던 엔티티를 반환한다. 이때 식별자 값을 이용하여 비교한다. 여기서 동일하다는 ..
JPA - JPAQuery와 Q클래스 긴 포스팅은 아니지만 예제로 소스를 짜는 도중에 몰랐던 내용을 알게되어서 작성한다. QueryDSL로 예제중 나온 상황이다. public List findMyDumbEntities(long id) { QMyEntity qMyEntity = QMyEntity.myEntity; JPAQuery jpaQuery = new JPAQuery(entityManager); MyEntity myFirstEntity = jpaQuery.from(qMyEntity) .where(qMyEntity.id.eq(id)).uniqueResult(qMyEntity); MyEntity mySecondEntity = jpaQuery.from(qMyEntity) .where(qMyEntity.id...
JPA - NativeQuery ( SQL ) 네이티브 SQL 사용하기! JPA는 SQL이 지원하는 대부분의 문법과 SQL 함수들을 지원하지만 특정 데이터베이스에 종속적인 기능은 잘 지원하지 않는다. 하지만 때론 특정 데이터베이스에 종속적인 기능이 필요할 수도 있다. 다양한 이유로 JPQL을 사용할 수 없을 때, JPA는 SQL을 직접 사용할 수 있는 기능을 제공하는데 이것을 네이티브 SQL(네이티브쿼리)라고 한다. 즉, 사용자가 직접 데이터베이스에 날리는 쿼리를 작성하는 것이다. 그렇다면 JPA가 지원하는 네이티브 SQL과 JDBC API를 직접 사용하는 것에는 어떤 차이가 있냐? 그것은 바로 네이트브 쿼리는 엔티티를 조회할 수 있고 JPA가 지원하는 영속성 컨텍스트의 기능을 그대로 사용할 수 있다는 ..
JPA - Criteria Query(객체지향 쿼리 빌더), JPQL Query Builder Class Criteria 쿼리는 JPQL을 자바 코드로 작성하도록 도와주는 빌더 클래스 API이다. Criteria를 사용하면 문자가 아닌 코드로 JPQL를 작성하므로 문법 오류를 컴파일 단계에서 잡을 수 있고 문자 기반의 JPQL보다 동적 쿼리를 안전하게 생성할 수 있다. 하지만 이번에 Criteria를 간단하게만 다루려고 한다. 이유는 실제 Criteria를 사용해서 개발하다보면 코드가 복잡하고 장황하며 직관적으로 이해하기 힘들다는 단점이 있기때문이다. 다음 포스팅에서는 코드로 쿼리를 작성할 수 있고 간단한 QueryDSL을 다음에 자세히 다뤄볼 예정이기에 이번 포스팅은 몇가지 간단하게만 다뤄본다. Cri..
JPA - JPQL 서브쿼리 (객체지향 쿼리 언어),컬렉션 식 JPQL도 서브 쿼리를 지원하지만 몇 가지 제약사항이 존재한다. -WHERE, HAVING 절에서만 사용할 수 있고, SELECT,FROM절에서는 사용할 수 없다. /* * 서브쿼리 - SQL과 다르게 where,having 절에서만 사용가능하다. */ public void subQuery() { String jpql = "select m from MemberJPQL m where m.age > (select avg(m2.age) from MemberJPQL m2)"; TypedQuery query = em.createQuery(jpql,MemberJPQL.class); List teams = query.getResultList(); Syst..
JPA - JPQL 조인(객체지향쿼리),Java Persistence Query Language JPQL 조인은 SQL 조인과 기능은 거의 같고 문법만 약간 다르다. 내부 조인(inner join) /* * 내부조인 */ public void innerJoin() { String jpql = "select m,t " + "from MemberJPQL m inner join m.team t " + "where t.name = '티스토리1' " ; Query query = em.createQuery(jpql); List members = query.getResultList(); System.out.println("================innerJoin================="); for(Obj..
JPA - JPQL(객체지향쿼리) (예제소스파일/ jpql package참조) JPQL은 가장 중요한 객체지향 쿼리 언어이다. Criteria나 QueryDSL은 결국 JPQL을 편리하게 사용하도록 도와주는 기술이므로 JPA로 데이터베이스 엑세스를 다룬다면 JPQL은 꼭 필수라고 생각이 든다. SQL과 꼭 닮은 쿼리 언어이며 SQL은 데이터 중심의 쿼리라고 하면 JPQL은 엔티티를 대상으로 하는 쿼리 언어라고 할 수 있다. 결국 JPA에서 해당 JPQL을 분석한 다음 적절한 SQL로 변환해주어서 데이터베이스에서 데이터를 가져오는 것이다. JPQL 특징 1. 엔티티 객체를 조회하는 객체지향 쿼리이다.(테이블 대상이 아니다.) 2. JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않는다.(데이터베..
spring boot 환경이 아니라, 일반 springframework 환경에서 진행하였습니다. 모든 소스는 mac OS 환경에서 진행되었습니다. 이번에는 ORM을 이용한 데이터베이스 조작입니다. ORM이란 자바객체와 관계형데이터베이스의 테이블 간의 매핑을 아주 쉽게 해주는 기술입니다. 주로 mybatis만 이용하는 저였기에 이 기술을 접하고 아주 신세계...하지만 둘다 장단점이 있는 기술인 것같습니다. 아직까지는 우리나라는 mybatis를 더욱 많이 쓰고 있는 것 같기도 한데....맞나요.. project 우클릭 -> properties -> project facets -> JPA 선택. resources 밑에 영속성 관련 설정을 할 수 있는 persistence.xml이 생성되어 있을 것입니다. 요 ..
ORM은 데이터를 다루는 RDBMS와의 상이한 시스템을 매핑하여 쉽게 데이터 관련 OOP 프로그래밍을 쉽게 하도록 하기 위한 테크닉입니다. OOP와 RDBMS 각각의 정보처리 방식이 다른 데 ORM을 이용하면 이를 중간엣 소통하게 해주는 통역자 역할을 하게 되어 쉽게 OOP언어로 data를 매핑하여 제어할 수 있습니다. 그렇다는 것은 RDBMS의 상세한 구조를 몰라도 개발자가 원하는 개발을 수행할 수 있다는 것이죠. 즉 Data Layer와 Presentation Layer를 자연스럽게 분리하고 Role을 명확히 하는 것이죠. 출처: https://engkimbs.tistory.com/287?category=688962 [새로비]
JPA(Java Persistent API) JPA는 여러 ORM 전문가가 참여한 EJB 3.0 스펙 작업에서 기존 EJB ORM이던 Entity Bean을 JPA라고 바꾸고 JavaSE, JavaEE를 위한 영속성(persistence) 관리와 ORM을 위한 표준 기술이다. JPA는 ORM 표준 기술로 Hibernate, OpenJPA, EclipseLink, TopLink Essentials과 같은 구현체가 있고 이에 표준 인터페이스가 바로 JPA이다. ORM(Object Relational Mapping)이란 RDB 테이블을 객체지향적으로 사용하기 위한 기술이다. RDB 테이블은 객체지향적 특징(상속, 다형성, 레퍼런스, 오브젝트 등)이 없고 자바와 같은 언어로 접근하기 쉽지 않다. 때문에 ORM을..