maven projects에 만들고
멤버 정보를 담는 객체
package reJPA.entity;
import javax.persistence.*;
@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;
}
}
persistence.xml
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.2">
<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"/>
</properties>
</persistence-unit>
</persistence>
애플리케이션 개발
엔티티 매니저 설정
엔티티 팩토리 만들어서 거기서 엔티티 매니저 생성해서 관리하게 됨
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
"hello"는 persistence.xml에서 줬던 <persistence-unit name="hello">입니다.
*에러가 났었는데 @Entity 이름 같은 vo클래스가 있으니까 에러 나더라. 그래서 원래 연습하던 곳에 @Entity 어노테이션 날려줬음
emf.close();
EntityManagerFactory 닫아주고... 실제로 쓸 때 팩토리 한번만 create해주고, 실제 쓸 때는 여기서 EntityManager 꺼내서 쓰도록 해야함!
EntityManager em = emf.createEntityManager();
이제 팩토리에서 매니저 얻어와.
웹 어플리케이션에서는 고객 요청 들어올 때 마다 엔티티매니저 만들어서 쓰면 된다. 그리고 이 요청 처리는 모두 트랜잭션 안에서 이루어진다.
EntityTransaction tx = em.getTransaction();
데이터베이스 접근해서 트랜잭션 가지고 옴.
tx.begin();
Member member = new Member();
member.setId(100L);
member.setName("안녕하세요");
em.persist(member);
//담아서 보낸다 insert! = persist
그렇게 tx.commit()하고.
em닫고, emf닫는다.
tx.commit();
em.close();
emf.close();
이걸 try catch문 써서
try{
Member member = new Member();
member.setId(100L);
member.setName("안녕하세요");
em.persist(member);
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
em.close();
}
emf.close();
이런 식으로 사용하게 된다.
emf는 왜 finally안에 안 넣고, 밖으로 뺀 걸까?
주의
-엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유(계속 생성하면?? 성능이 아주 구려진다..)
-엔티티 매니저는 쓰레드간 공유하면 안 된다(사용하고 버려야 한다) (사용자 정보 들어갔다. 근데 또 같은 엔티티 매니저에 정보를 넣었다? SQL문이 문제가 생길 수 있음 요청할 때 마다 꺼내서 새로 줘!)
-JPA의 모든 데이터 변경은 트랜잭션 안에서 실행
해당 포스팅은 T아카데미에서 진행한 김영한 강사님의 JPA 유튜브 강의를 듣고 정리한 것입니다 : ) https://www.youtube.com/watch?v=WfrSN9Z7MiA&list=PL9mhQYIlKEhfpMVndI23RwWTL9-VL-B7U
'Spring > JPA' 카테고리의 다른 글
JPA 필드와 칼럼 매핑 (0) | 2021.04.11 |
---|---|
JPA persistence.xml과 라이브러리 설정 (0) | 2021.04.11 |
JPA 기초와 매핑 (0) | 2021.04.11 |
JPA에 대해서 (0) | 2021.04.11 |
JPA, 객체지향과 RDB (0) | 2021.04.11 |
Uploaded by Notion2Tistory v1.1.0