ABOUT ME

Today
Yesterday
Total
  • [자바 ORM 표준 JPA 프로그래밍] [섹션 0~2] JPA 시작하기
    JPA/자바 ORM 표준 JPA 프로그래밍 2023. 7. 8. 23:11

    pom.xml 설정

    <?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-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
            <!-- JPA 하이버네이트 -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>5.3.10.Final</version>
            </dependency>
    
            <!-- H2 DB -->
            <!-- 버전을 꼭 다운로드 받았을 때의 버전과 맞춰줘야함 -->
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>2.2.220</version>
            </dependency>
        </dependencies>
    </project>

     

    persistence.xml 설정

    <?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"/>
    
                <!-- 옵션-->
                <!-- show_sql은 쿼리가 나가는걸 보여주는 옵션설정
                     foramt_sql은 이쁘게 포맷팅
                     use_sql_comments는 이쿼리가 나온 이유에 대한 코멘트
                -->
                <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>

     

    데이터베이스 방언

    • persistence.xml의 <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> 를 수정

     

     

    DB

    create table Member (
        id bigint not null,
        name varchar(255),
        primary key (id)
    );

     

    JpaMain.java

    package hellojpa;
    
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;
    
    public class JpaMain {
        public static void main(String[] args) {
            // Persistence.xml에서 설정해준 name으로 factory를 만들어서 연결
            // 웹 서버가 올라오는 시점에 딱 1개만 생성
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    
            // 고객의 요청이 올 때마다 썼다가 버림(em.close)
            // 그래서 쓰레드간에 절대 공유 X(사용하고 버려야됨)
            EntityManager em = emf.createEntityManager();
    
            EntityTransaction tx = em.getTransaction();
    
            tx.begin();
    
            // JPA의 모든 DATA 변경은 트랜잭션 안에서 실행
            // 단순 조회는 트랜잭션 필요 X
            try {
                // * insert
    //            Member member = new Member();
    //            member.setId(1L);
    //            member.setName("HelloA");
    //            em.persist(member);
    
                // * select
    //            Member findMember = em.find(Member.class, 1L);
    //            System.out.println("findMember.id = " + findMember.getId());
    //            System.out.println("findMember.name = " + findMember.getId());
    
                // * delete
    //            Member findMember = em.find(Member.class, 1L);
    //            em.remove(findMember);
    
                // * update
                // 객체에서 값만 바꿔도 되는 이유는 JPA가 관리해서 트랜잭션을
                // 커밋하는 시점에 다 체크해서 UPDATE 쿼리를 만들어서 날림 그 이후에 커밋
                Member findMember = em.find(Member.class, 1L);
                findMember.setName("HelloJPA");
    
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            } finally {
                em.close();
            }
    
            emf.close();
        }
    }

     

    Member.java

    package hellojpa;
    
    import javax.persistence.Entity;
    import javax.persistence.Id;
    
    @Entity
    public class Member {
        @Id
        private Long id;
        private String name;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

     

     

    JPQL

     

    댓글

Designed by Tistory.