반응형
public class JpaMain {
public static void main( final String[] args ) {
/*
* javax에서 제공하는 Persistence에서 entity manager factory 얻어오기.
* Persistence unit name은 persistence.xml에 기입한
* <persistence-unit name="###">
* 과 같아야
*/
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "hello" );
// entity namager factory 에서 entity manager 얻어오기 (database connection 받아온 것과 비슷함)
EntityManager em = emf.createEntityManager();
// transaction 얻어오기
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member member = new Member();
member.setId( 2L );
member.setName( "HelloB" );
// jpa 저장
em.persist( member );
// database 저장
tx.commit();
} catch ( Exception e ) {
// transaction rollback
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
public class JpaMain {
public static void main( final String[] args ) {
/*
* javax에서 제공하는 Persistence에서 entity manager factory 얻어오기.
* Persistence unit name은 persistence.xml에 기입한
* <persistence-unit name="###">
* 과 같아야
*/
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "hello" );
// entity namager factory 에서 entity manager 얻어오기 (database connection 받아온 것과 비슷함)
EntityManager em = emf.createEntityManager();
// transaction 얻어오기
EntityTransaction tx = em.getTransaction();
tx.begin();
Member member = new Member();
member.setId( 1L );
member.setName( "HelloA" );
// jpa 저장
em.persist( member );
// database 저장
tx.commit();
em.close();
emf.close();
}
}
어떤 테이블인지 지정해 주지 않았지만, class와 같은 이름의 테이블에 insert 하는 sql을 생성함.
JPA를 통해서 데이터를 가져오면, JPA가 알아서 관리를 해준다.
// 검색
Member findMember = em.find( Member.class, 1L );
System.out.println( findMember.getId() );
System.out.println( findMember.getName() );
// 수정
findMember.setName( "memberJPA" );
변경이 되었는지 아닌지 transaction을 commit하는 시점에 다 체크를 한다. 만약, 수정되었다면, update 쿼리를 만들어 실행한 후, commit함.
setter 메서드를 이용하여 수정해주면, update 메서드를 이용하여 다시 저장해주지 않아도 된다.
- 엔티티 매니저 팩토리는 웹 서버가 올라오는 시점에 디비 당 하나만 생성된다.
- 엔티티 메니저는 요청을 받을 때마다 생성되고, 사용한 후, close 된다.
-> 엔티티 매니저는 ㅅ쓰레드 간에 공유해서는 안된다. - JPA의 모든 데이터 변경은 트랜젝션 안에서 실행해야 한다.
JPQL 사용하기
List<Member> result = em.createQuery( "select m from Member as m", Member.class )
.setFirstResult( 0 )
.setMaxResults( 10 )
.getResultList();
for ( Member member : result ) {
System.out.println( "Member name : " + member.getName() );
}
- JPA를 사용하면 엔티티 객체를 중심으로 개발
- 문제는 검색 쿼리
- 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색
- 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
- 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검 색 조건이 포함된 SQL이 필요
- 객체 지향 쿼리테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리
- SQL을 추상화해서 특정 데이터베이스 SQL에 의존X
- JPQL을 한마디로 정의하면 객체 지향 SQL
- JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
- SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
- JPQL은 엔티티 객체를 대상으로 쿼리
- SQL은 데이터베이스 테이블을 대상으로 쿼리
반응형
'Spring > JPA & Hibernate' 카테고리의 다른 글
플러시 (0) | 2019.12.18 |
---|---|
영속성 컨텍스트 (0) | 2019.12.18 |
h2 database 사용하기 (0) | 2019.12.17 |
고급 매핑 (0) | 2019.12.17 |
연관관계 맵핑 (0) | 2019.11.21 |