org.hibernate.dialect.H2Dialect
org.hibernate.dialect.Oracle10gDialect
org.hibernate.dialect.MySQL5InnoDBDialect
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
</properties>
๐ ๊ฐ์ฒด, ํ ์ด๋ธ ์์ฑํ๊ณ ๋งคํ
@Entity //JPA๊ฐ ๊ด๋ฆฌํ ๊ฐ์ฒด๋ผ๋ ๊ฒ์ ์๋ ค์ค
public class Member {
@Id //DB์ PK์ ๋งคํ
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;
}
}
@Entity
: JPA๊ฐ ๊ด๋ฆฌํ ๊ฐ์ฒด๋ผ๋ ๊ฒ์ ์๋ ค์ค
@Id
: DB์ PK์ ๋งคํ
create table Member (
id bigint not null,
name varchar(255),
primary key (id)
);
๐ ํ์ ๋ฑ๋ก
โฝ EntityManagerFactory
๋ JPA๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ก์ธ์คํ๋ ๋ฐ ํ์ํ EntityManager
์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
โฝ EntityManager
๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์
์ ๊ด๋ฆฌํ๊ณ ์ํฐํฐ์ ์์์ฑ์ ์ ์ดํ๋ค.
public class JpaMain {
public static void main(String[] args) {
//persistence ํด๋์ค๊ฐ persistence.xml์ ์ฝ๊ณ , EntityManagerFactory ์์ฑ
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
//EntityManagerFactory๊ฐ EntityManager๋ฅผ ์์ฑ
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction(); //ํธ๋์ญ์
์ถ๊ฐ
tx.begin();
try {
Member member = new Member();
member.setId(3L);
member.setName("HelloC");
em.persist(member);
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
โฝ EntityManagerFactory
๋ ํ๋๋ง ์์ฑํด์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์์ ๊ณต์ ํ๋ค.
โฝ EntityManager
๋ ์ฐ๋ ๋ ๊ฐ์ ๊ณต์ ํ์ง ์๋๋ค. (์ฌ์ฉํ๊ณ ๋ฒ๋ ค์ผ ํ๋ค)
โฝ JPA์ ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ํธ๋์ญ์
์์์ ์คํํด์ผ ํ๋ค.
โฝ ํธ๋์ญ์
์์ ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๊ฒฝ์ฐ ํธ๋์ญ์
์ ROLLBACK ํด์ผ ํ๋ค. ๋ํ, ๋ฌธ์ ์ฌ๋ถ์ ์๊ด์์ด EntityManager๋ฅผ ๋ซ์์ DB Connection์ ์ข
๋ฃํด์ผ ํ๋ค.
๐ ํ์ ๋ฑ๋ก ์คํ ํ๋ฉด
๐ ํ์ ๋จ๊ฑด ์กฐํ
try {
Member findMember = em.find(Member.class, 1L);
System.out.println("findMember.id = " + findMember.getId());
System.out.println("findMember.name = " + findMember.getName());
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally {
em.close();
}
๐ ํ์ ๋จ๊ฑด ์กฐํ ์คํ ํ๋ฉด
๐ ํ์ ์ญ์
try {
Member findMember = em.find(Member.class, 3L);
em.remove(findMember);
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally {
em.close();
}
๐ ํ์ ์ญ์ ์คํ ํ๋ฉด
๐ ํ์ ์์
try {
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally {
em.close();
}
๐ ํ์ ์์ ์คํ ํ๋ฉด
โฝ ์๋ฐ ๊ฐ์ฒด๋ฅผ ์์ ํ๋ฏ์ด DB๋ฅผ ์์ ํ ์ ์๋ค.
โฝ JPA๋ฅผ ํตํ์ฌ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒฝ์ฐ JPA์์ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ์ฌ ํธ๋์ญ์
์์ ์ ๊ฐ์ฒด์ ๋ณ๊ฒฝ ์ฌ๋ถ๋ฅผ ๊ฐ์งํ์ฌ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋์์ ๊ฒฝ์ฐ UPDATE ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
๊ฐ์ฅ ๋จ์ํ ์กฐํ ๋ฐฉ๋ฒ
โฝ EntityManager.find()
โฝ ๊ฐ์ฒด ๊ทธ๋ํ ํ์(a.getB().getC())
โ ๋จ์ํ ์กฐํ ๋ฐฉ๋ฒ์ด ์๋ ์กฐ๊ฑด์ ๋ถ์ฌํด์ ๋์ด๊ฐ 18์ด ์ด์์ธ ํ์์ ๋ชจ๋ ๊ฒ์ํ๊ณ ์ถ๋ค๋ฉด? ๋ชจ๋ ํ์์ ๊ฒ์ํ๊ณ ์ถ๋ค๋ฉด?
โ ์ด๋ด ๋ JPQL์ ์ฌ์ฉํ์ฌ ๋ค์์ ๊ฐ์ฒด๋ฅผ ์กฐํํ ์ ์๋ค.
๐ ํ์ ๋ค์ ์กฐํ
try {
List<Member> result = em.createQuery("select m from Member as m", Member.class).getResultList();
for (Member member : result) {
System.out.println("member.name = " + member.getName());
}
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally {
em.close();
}
๐ ํ์ ๋ค์ ์กฐํ ์คํ ํ๋ฉด
JPA๋ฅผ ์ฌ์ฉํ๋ฉด ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์ค์ฌ์ผ๋ก ๊ฐ๋ฐ
โพ ๋ฌธ์ ๋ ๊ฒ์ ์ฟผ๋ฆฌ์ธ๋ฐ, JPA๋ ๊ฒ์์ ํ ๋๋ ํ
์ด๋ธ์ด ์๋ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ๊ฒ์ํ๋ค.
โพ ๊ทธ๋ฌ๋ ๋ชจ๋ DB ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋ณํํด์ ๊ฒ์ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
โพ ์ ํ๋ฆฌ์ผ์ด์
์ด ํ์ํ ๋ฐ์ดํฐ๋ง DB์์ ๋ถ๋ฌ์ค๋ ค๋ฉด ๊ฒฐ๊ตญ ๊ฒ์ ์กฐ๊ฑด์ด ํฌํจ๋ SQL์ด ํ์ํ๋ค.
JPQL
โพ JPA๋ SQL์ ์ถ์ํํ JPQL์ด๋ผ๋ ๊ฐ์ฒด ์งํฅ ์ฟผ๋ฆฌ ์ธ์ด ์ ๊ณตํ๋ค.
โพ SQL๊ณผ ๋ฌธ๋ฒ ์ ์ฌ, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN ์ง์
โพ JPQL์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ
โพ SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ๋์์ผ๋ก ์ฟผ๋ฆฌ
โพ ํ
์ด๋ธ์ด ์๋ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ๊ฒ์ํ๋ ๊ฐ์ฒด ์งํฅ ์ฟผ๋ฆฌ
โพ SQL์ ์ถ์ํํด์ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค SQL์ ์์กดํ์ง ์์
โพ JPQL์ ํ๋ง๋๋ก ์ ์ํ๋ฉด ๊ฐ์ฒด ์งํฅ SQL