hello jpa
hello jpa
*김영한 님의 인프런 강의를 기반으로 정리한 글입니다.
엔티티매니저팩토리는 하나만 생성해서 애플리케이션 전체에서 공유함.
앤티티매니저는 쓰레드간 공유하지 않음. 절대절대(사용하고 버릴 것)
여러 쓰레드에서 같이 쓰면 장애 발생.
JPA의 모든 데이터 변경은 트랜잭션안에서 실행되어야 함
main
package hello;
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) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
//로딩 시점에 딱 하나만 만들어줘야 한다.
EntityManager em = emf.createEntityManager();
//db커넥션 얻어서 쿼리 날리고 종료 하는 단위마다 엔티티매니저 만들어줘야 함
EntityTransaction tx = em.getTransaction();//데이터베이스 트랜잭션 생성
tx.begin();//tx시작.
//트랜잭션이란? 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위
Member member = new Member();
member.setId(1L);
member.setName("HelloA");
em.persist(member);//인서트 위한 메서드
tx.commit();//트랜젝션의 처리 과정을 데이터베이스에 반영하기 위해서, 변경된 내용을 모두 영구 저장. + 트랜잭션 종료
em.close();
emf.close();
}
}
우리가 설정해준
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
이 설정들 덕분에 저런 쿼리가 찍힌다. show로 보여주고 format으로 예쁘게 만들어주고 comments로 어떤 쿼리인지 적어준 것!
db에서 조회하면~~
짠! 잘 나온다.
근데 여기서 한가지 의문
나는 어느 테이블에 넣으라고 지정 안해줬는데 알아서 잘 들어갔네..?
관례라서 그렇다고 한다!
이름을 지정해주고 싶으면 class위에 @Table(name = “지정테이블명”)을 해주자.
혹시 내가 지정한 변수 명과 테이블 내 컬럼명이 다르다면 변수 위에 @Colume(name=”컬럼명”) 을 해주자!
보통 db에 저장하기 위한 정석 코드!
package hello;
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) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
//로딩 시점에 딱 하나만 만들어줘야 한다.
EntityManager em = emf.createEntityManager();
//db커넥션 얻어서 쿼리 날리고 종료 하는 단위마다 엔티티매니저 만들어줘야 함
EntityTransaction tx = em.getTransaction();//데이터베이스 트랜잭션 생성
tx.begin();//tx시작.
//트랜잭션이란? 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위
try{
Member member = new Member();
member.setId(1L);
member.setName("HelloA");
em.persist(member);//인서트 위한 메서드
tx.commit();//트랜젝션의 처리 과정을 데이터베이스에 반영하기 위해서, 변경된 내용을 모두 영구 저장. + 트랜잭션 종료
}
catch (Exception e){
tx.rollback();
}finally {
em.close();
}
emf.close();
}
}
근데 이 과정을 jpa가 대신 해준다고 한다!
Member findMember = em.find(Member.class,1L);
이렇게 찾을 수도 있음. 테이블 객체랑 pk값을 전달!
만약 나이가 18살 이상인 회원을 검색하고 싶으면.....?
⇒JPQL이라는 것을 사용해야 한다!
⇒createQuery(”sql문”, 타입).getResultList();
⇒그런데 sql문의 대상이 table이 아니고 엔티티 객체임. Member객체에서 조회하고 그러는 것.
⇒setFirstResulte(1).setMaxResulte(10) 이런 식으로 메서드를 적으면 이걸 각 db의 방언에 맞게 쿼리를 짜서 날려줌 1부터 10까지...!
sql을 추상화 한 객체지향쿼리언어.
em.remove(findMember);
이렇게 remove 메서드를 사용해서 삭제도 가능
findMember.setName("HelloJPA");
이런식으로 객체 이름을 바꿔 db 이름을 수정해버릴 수도 있음.
jpa가 트랜잭션 커밋 전에 업데이트 내용을 확인하고 변경 사항이 있으면 업데이트 쿼리를 만들어서 날려버리기 때문!
쩐다..
persiste 안해도 됨...