본문 바로가기

Spring/JPA & Hibernate

JPA Example

반응형

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