공부일기/JPA

JPA 공부일기(2)

고다나 2022. 12. 17. 21:59
[자바 ORM 표준 JPA 프로그래밍 - 기본편] Hello JPA - 프로젝트 생성 ~  Hello JPA - 애플리케이션 개발

 

pom.xml에 dependency추가

- JPA 하이버네이트: spring boot 버전에 맞추어 호환되는 org.hibernate 버전 사용.

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
 <modelVersion>4.0.0</modelVersion> 
 	
    <groupId>jpa-basic</groupId> 
 	<artifactId>ex1-hello-jpa</artifactId> 
 	<version>1.0.0</version> 
 
 	<dependencies> 
 	  <!-- JPA 하이버네이트 --> 
	  <dependency> 
		<groupId>org.hibernate</groupId> 
		<artifactId>hibernate-entitymanager</artifactId> 
		<version>5.3.10.Final</version> 
	  </dependency> 
 	  <!-- H2 데이터베이스 --> 
 	  <dependency> 
 		<groupId>com.h2database</groupId> 
 		<artifactId>h2</artifactId> 
 		<version>1.4.199</version> 
 	  </dependency> 
 	</dependencies> 
</project>

 

persistence.xml에 jdbc 연결 속성 추가

- JPA는 특정 데이터베이스에 종속되지 않음.

- 사용하는 데이터베이스에 따라 hibernate.dialect 속성에 지정하면 데이터베이스 방언(특정 데이터베이스만의 고유 기능)지원.

· h2: org.hibernate.dialect.H2Dialect

· Oracle 10g: org.hibernate.dialect.Oracle10gDialect

· MySQL: org.hibernate.dialect.MySQL5InnoDBDDialect

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.2" 
  xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"> 
 	
  <persistence-unit name="hello"> 
    <properties> 
      <!-- 필수 속성 --> 
      <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> 
      <property name="javax.persistence.jdbc.user" value="sa"/> 
      <property name="javax.persistence.jdbc.password" value=""/> 
      <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> 
 
      <!-- 옵션 --> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.format_sql" value="true"/> 
      <property name="hibernate.use_sql_comments" value="true"/> 
      <!--<property name="hibernate.hbm2ddl.auto" value="create" />--> 
    </properties> 
  </persistence-unit> 
</persistence>

 

JPA 구동방식

1.Persistence 클래스에서 META-INF/persistence.xml 파일의 설정 정보를 조회해서 2.EntityManagerFactory 클래스를 생성. 3. 요청이 올 때마다 EntityManager( DB 커넥션을 얻어서 쿼리를 날리고 종료되는 한 단위 동안 사용)를 생성해서 사용.

 

- EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유.

- EntityManager는 쓰레드 간에 공유x(사용하고 버려야한다).

- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행.

public class JpaMain {

    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {
            List<Member> result = em.createQuery("select m from Member as m", Member.class);
            for(Member member : result) {
                System.out.println("member.name = " + member.getName());
            }
            tx.commit();        
        } catch(Exception e) { 
            tx.rollback();          
        } finally{ 
            em.close(); 
        }	
        emf.close();
    }
}

 

 

@Entity: JPA가 관리할 객체

@Table(name="테이블명"): 객체명과 테이블명이 다를 때 테이블명을 적어서 매핑되도록 함.

@Id: 데이터베이스 pk와 매핑

@Coulmn(name="컬럼명"): 객체의 컬럼명과 테이블 컬럼명이 다를 때 테이블 컬럼명을 적어서 매핑되도록 함.