λ°μ΄ν°λ₯Ό μμ±ν νλ‘κ·Έλ¨μ΄ μ’ λ£λμ΄λ μ¬λΌμ§μ§ μλ λ°μ΄ν°μ νΉμ±μ λ§νλ€. μμμ±μ κ°μ§ μμΌλ©΄ λ°μ΄ν°λ λ©λͺ¨λ¦¬μμλ§ μ‘΄μ¬νκ² λκ³ , νλ‘κ·Έλ¨μ΄ μ’ λ£λλ©΄ ν΄λΉ λ°μ΄ν°λ λͺ¨λ μ¬λΌμ§κ² λλ€. κ·Έλμ μ°λ¦¬λ λ°μ΄ν°λ₯Ό νμΌμ΄λ DBμ μꡬμ μΌλ‘ μ μ₯ν¨μΌλ‘μ¨ μμμ±μ λΆμ¬νλ€.
λΉμμ βΆ μμ βΆ μ€μμ | μμ
λΉμμ(new/transient): μν°ν° κ°μ²΄κ° λ§λ€μ΄μ Έμ μμ§ μ μ₯λμ§ μμ μν. μμμ± μ»¨ν μ€νΈμ μ ν κ΄κ³κ° μμ.
μμ(managed): μν°ν°κ° μμμ± μ»¨ν μ€νΈμ μ μ₯λμ΄, μμμ± μ»¨ν μ€νΈκ° κ΄λ¦¬ν μ μλ μν.
μ€μμ(detached): μν°ν°κ° μμμ± μ»¨ν μ€νΈμ μ μ₯λμ΄ μλ€κ° λΆλ¦¬λ μν. μμμ± μ»¨ν μ€νΈκ° λ μ΄μ κ΄λ¦¬νμ§ μμ.
μμ (removed): μν°ν°λ₯Ό μμμ± μ»¨ν μ€νΈμ DBμμ μμ νκ² λ€κ³ νμν μν
κ°μ²΄μ μμμ± μνλ Entity Managerμ λ©μλλ₯Ό ν΅ν΄ μ νλλ€. Raw JPA κ΄μ μμ μμλλ‘ μμ½ μ 리λ₯Ό ν΄λ³΄μλ©΄...
- Persist(), merge() β (μμμ± μ»¨ν μ€νΈμ μ μ₯λ μν: Managed) β flush() β (DBμ μΏΌλ¦¬κ° μ μ‘λ μν) β commit() β (DBμ μΏΌλ¦¬κ° λ°μλ μν)
// 1οΈβ£ μμμ± μ»¨ν
μ€νΈμ λ΄μ μν μν°ν° μμ±
Item item = new Item();
item.setItemNm("ν
μ€νΈ μν");
// 2οΈβ£ μν°ν° 맀λμ ν©ν 리λ‘λΆν° μν°ν° 맀λμ λ₯Ό μμ±
EntityManager em = entityManagerFactory.createEntityManager();
// 3οΈβ£ λ°μ΄ν° λ³κ²½ μ 무결μ±μ μν΄ νΈλμμ
μμ
EntityTransaction transaction = em.getTransaction();
transaction.begin();
// 4οΈβ£ μμμ± μ»¨ν
μ€νΈμ μ μ₯λ μν, μμ§ DBμ INSERT SQL 보λ΄κΈ° μ
em.persist(item);
// 4οΈβ£-2 (DBμ SQL 보λ΄κΈ°/commitμ μλμνλμ΄ μλ΅ κ°λ₯ν¨)
em.flush(item);
// 5οΈβ£ νΈλμμ
μ DBμ λ°μ, μ΄ λ μ€μ λ‘ INSERT SQL μ»€λ° μν
transaction.commit();
// 6οΈβ£ μν°ν° 맀λμ μ μν°ν° 맀λμ ν©ν 리 μμμ close() νΈμΆλ‘ λ°ν
em.close();
flush()
λμμ΄ λ°μνκΈ° μ κΉμ§ μ΅μ ν.flush()
λμμΌλ‘ μ μ‘λ 쿼리λ λ μ΄μ 쿼리 μ΅μ νλ λμ§ μκ³ , μ΄ν commit()
μΌλ‘ λ°μλ§ κ°λ₯.μ¬λ¬ κ°μ κ°μ²΄λ₯Ό μμ±ν κ²½μ°, λͺ¨μμ ν λ²μ 쿼리λ₯Ό μ μ‘.
μμμ± μνμ κ°μ²΄κ° μμ± λ° μμ μ΄ μ¬λ¬ λ² μΌμ΄λλλΌλ, ν΄λΉ νΈλμμ μ’ λ£ μ, 쿼리λ 1λ²λ§ μ μ‘λ μ μμ.
μμμ± μνμμ, κ°μ²΄κ° μμ± ν μμ λμλ€λ©΄, μ€μ DBμλ μ무 λμμ΄ μ μ‘λμ§ μμ μ μμ.
μ¦, μ¬λ¬κ°μ§ λμμ΄ λ§μ΄ λ°μνλλΌλ, 쿼리λ νΈλμμ λΉ μ΅μ ν λμ΄ μ΅μ μΏΌλ¦¬λ§ λ μκ°κ² λ¨.
ν€ μμ± μ λ΅μ΄
generationType.IDENTITY
λ‘ μ€μ λμ΄μλ κ²½μ°, μμ± μΏΌλ¦¬λ μ°κΈ°μ§μ°μ΄ λ°μνμ§ λͺ»νλ€.
why?
λ¨μΌ μΏΌλ¦¬λ‘ μνν¨μΌλ‘μ¨, μΈλΆ νΈλμμ μ μν μ€λ³΅ ν€ μμ±μ λ°©μ§νμ¬ λ¨μΌν€λ₯Ό 보μ₯νκΈ° λλ¬Έμ...
Team teamA = new Team();
teamA.setName("TeamA");
em.persist(teamA); // teamA: μμμ± μν
Team teamB = new Team();
teamB.setName("TeamB");
em.persist(teamB); // teamB: μμμ± μν
Member member_A = new Member();
member_A.setName("memberA");
member_A.setTeam(teamA);
em.persist(member_A); // member_A: μμμ± μν
em.flush(); // * β Insert μΏΌλ¦¬κ° λ μκ°
Member findMember = em.find(Member.class, member_A.getId());
Team findTeam = findMember.getTeam();
System.out.println(findTeam.getName());
flush()
κ° μλ κ²½μ°create member
create team
insert team // flushλ‘ μΈν΄ μ°κΈ°μ§μ°μ΄ λ°μνμ§ μμ
insert member // flushλ‘ μΈν΄ μ°κΈ°μ§μ°μ΄ λ°μνμ§ μμ
print "TeamA" (memberA.getTeam())
flush()
κ° μλ κ²½μ°create member
create team
print "TeamA" (memberA.getTeam()) // μ°κΈ° μ§μ°μ΄ λ°μνλλΌλ μμμ± μ»¨ν
μ€νΈμμ μ‘°νν΄μ΄
insert team // μ°κΈ° μ§μ°μ΄ λ°μν λΆλΆ
insert member // μ°κΈ° μ§μ°μ΄ λ°μν λΆλΆ
FetchType
==Β LAZY
.mappedBy
: μ°κ΄κ΄κ³μ μ£ΌμΈ νλfetch
: κΈλ‘λ² fetch μ λ΅ μ€μ .cascade
: μμμ± μ μ΄ κΈ°λ₯μ μ¬μ©.targetEntity
: μ°κ΄λ μν°ν°μ νμ
μ 보λ₯Ό μ€μ .@ManyToOne
(λ€λμΌ κ΄κ³)optional (default true)
: false
λ‘ μ€μ νλ©΄ μ°κ΄λ μν°ν°κ° λ°λμ μμ΄μΌ ν¨.fetch
: κΈλ‘λ² fetch μ λ΅ μ€μ .EGEAR
λ‘ μ€μ λμ΄μμΌλ μ€λ¬΄μμλ κΈ°λ³Έ LAZY
λ‘ μ€μ νλκ² μΆμ²!cascade
: μμμ± μ μ΄ κΈ°λ₯ μ¬μ©.targetEntity
: μ°κ΄λ μν°ν°μ νμ
μ 보 μ€μ .targetEntity = Member.class
μμΌλ‘ μ¬μ©)@Entity(name = "parent")
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany
@JoinColumn(name = "parent_id")
private List<Child> childList;
}
@Entity(name = "child")
public class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "parent_id")
private Long parentId;
}
μΌλλ€ μλ°©ν₯ κ΄κ³λ μμ!
@Entity(name = "parent")
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy="parent")
private List<Child> childList;
}
@Entity(name = "child")
public class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "parent_id")
private Parent parent;
}