JPAμ μν°ν° μν
- Transient: μν°ν°κ° μμμ± μ»¨ν μ€νΈμ κ΄λ¦¬λμ§ μλ μνμ΄λ€. μλ‘μ΄ μν°ν° κ°μ²΄λ₯Ό μμ±νμ§λ§ μμ§ μμμ± μ»¨ν μ€νΈμ μΆκ°λμ§ μμλ€.
User user = new User();
user.setName("John Doe");
// userλ transient μν
- Persistent: μν°ν°κ° μμμ± μ»¨ν μ€νΈμ μν΄ κ΄λ¦¬λλ μνμ΄λ€. μ΄ μνμμλ μν°ν°μ λ³κ²½ μ¬νμ΄ μμμ± μ»¨ν μ€νΈμ μν΄ μΆμ λκ³ , νΈλμμ μ΄ μ»€λ°λ λ λ°μ΄ν°λ² μ΄μ€μ λ°μλλ€.
entityManager.persist(user);
// userλ persistent μν
- Detached: μν°ν°κ° μμμ± μ»¨ν μ€νΈμ μν΄ λ μ΄μ κ΄λ¦¬λμ§ μλ μνμ΄λ€. μ£Όλ‘ νΈλμμ μ΄ μ’ λ£λκ±°λ μν°ν° λ§€λμ κ° λ«ν λ λ°μνλ€.
entityManager.detach(user);
// userλ detached μν
- Removed: μν°ν°κ° μμ λκΈ°λ‘ νμλ μνμ΄λ€. remove λ©μλλ₯Ό νΈμΆνμ¬ μν°ν°λ₯Ό μ κ±°νλ€. νΈλμμ μ΄ μ»€λ°λ λ λ°μ΄ν°λ² μ΄μ€μμ μμ λλ€.
entityManager.remove(user);
// userλ removed μν
μμ
μν°ν° ν΄λμ€
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_name", nullable = false)
private String name;
private int age;
// getters and setters
}
μμμ± μ»¨ν μ€νΈ μ¬μ© μμ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
public class JpaMain {
public static void main(String[] args) {
// μμ§κΉμ§λ ν΄λΉ μν°ν°λ₯Ό μν°ν° λ§€λμ κ° κ΄λ¦¬νμ§ μλλ€.
User user = new User();
user.setName("John Park");
user.setAge(30);
//META-INF/persistence.xmlμμ μ΄λ¦μ΄ dbμΈ persistence-unitμ μ°Ύμμ μν°ν° λ§€λμ ν©ν 리λ₯Ό μμ±
EntityManagerFatory emf = Persistence.createEntityManagerFactory("db");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
// μν°ν° λ§€λμ μμ μννλ λͺ¨λ λ‘μ§μ νΈλμμ μμμ μνλΌμΌ νλ€.
tx.begin();
// μ΄λ κ² νλ©΄ ν΄λΉ μν°ν° λ§€λμ μ μμμ± μ»¨ν
μ€νΈμ μμμ λ§λ User κ°μ²΄κ° μ μ₯λλ€.
// μ΄μ user μν°ν°λ μν°ν° λ§€λμ μ κ΄λ¦¬ λμμ΄ λκ³ , μμμ±μ κ°μ‘λ€κ³ λ§ν μ μλ€.
em.persist(user);
// μν λ³κ²½ κ°μ§ (Dirty Checking)
user.setName("Jane Park");
// Detached μν
em.detach(user);
// λ€μ Persistent μνλ‘ λ³κ²½
em.merge(user);
// νΈλμμ
μ 컀λ°νλ€. DBλ‘ flushκ° μΌμ΄λλ©΄μ DBμ λ°μ΄ν°κ° μμλλ€.
tx.commit();
} catch(Exception e) {
// μ΄λ€ μ΄μ μμ μ€λ₯κ° λ¬λ€λ©΄ νΈλμμ
μ λ‘€λ°± μμΌμ€μΌνλ€.
tx.rollback();
} finally {
// μν°ν° λ§€λμ λ₯Ό μ’
λ£μμΌμ€μΌ νλ€.
em.close();
}
emf.close(); // λ§μ°¬κ°μ§λ‘ μν°ν° λ§€λμ ν©ν 리λ λμ΄μ μ°μ§ μλλ€λ©΄ μ’
λ£μμΌμ€μΌ νλ€.
}
}
|
cs |
μμ½
- μμμ± μ»¨ν μ€νΈ(Persistence Context): μν°ν° λ§€λμ κ° κ΄λ¦¬νλ μν°ν° μΈμ€ν΄μ€λ€μ μ§ν©μΌλ‘, μν°ν°μ μλͺ μ£ΌκΈ°λ₯Ό κ΄λ¦¬νκ³ 1μ°¨ μΊμ λ° λ³κ²½ κ°μ§ κΈ°λ₯μ μ 곡νλ€.
- μν°ν° μν: Transient(μμμ± μ»¨ν μ€νΈμ κ΄λ¦¬λμ§ μλ μν), Persistent(μμμ± μ»¨ν μ€νΈμ μν΄ κ΄λ¦¬λλ μν), Detached(μμμ± μ»¨ν μ€νΈμ μν΄ λ μ΄μ κ΄λ¦¬λμ§ μλ μν), Removed(μμ λ μν)λ‘ κ΅¬λΆλλ€.
μ°Έκ³
μΈνλ° - μλ° ORM νμ€ JPA νλ‘κ·Έλλ° - κΈ°λ³ΈνΈ / κΉμν
λκΈ