λ Έμ리(π©ΈAB) | λ°μ λΉ(π©ΈA) | μ΄μ£Όμ(π©ΈB) | νλ―Όμ(π©ΈO) |
---|---|---|---|
@soljjang777 | @Ungbbi | @2oo1s | @HongMinYeong |
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
EMPNO | int | NO | PRIMARY KEY | ||
COMM | int | YES | |||
ENAME | String | YES | |||
JOB | String | YES | |||
HIERDATE | String | YES | |||
SAL | int | YES | |||
MGR | int | YES | |||
DEPTNO | int | YES | FOREIGN KEY |
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
DEPTNO | int | NO | PRIMARY KEY | ||
DNAME | String | YES | |||
LOC | String | YES |
@Entity
public class Dept {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
π μλλ Dept μν°ν° ν΄λμ€λ₯Ό μ¬μ©νμ¬ Dept
μν°ν°μ λͺ¨λ λ μ½λλ₯Ό κ°μ Έμ€λ JPQL 쿼리μ μμ
λλ€:
List<Dept> datas = em.createQuery("select d from Dept d", Dept.class).getResultList();
- JPQL 쿼리μμ
Dept.class
λ₯Ό μ¬μ©νμ¬Dept
νμ μΌλ‘ κ²°κ³Όλ₯Ό κ°μ Έμ€λ μ΄μ λ 무μμΈκ°μ? - μμ JPQL 쿼리λ₯Ό μ¬μ©νμ¬
Dept
μν°ν°μname
νλκ° "Sales"μΈ λͺ¨λDept
κ°μ²΄λ₯Ό μ‘°ννλ €λ©΄ 쿼리λ₯Ό μ΄λ»κ² μμ ν΄μΌ νλμ?
- Dept.classλ₯Ό μ¬μ©νλ μ΄μ | Dept.classλ₯Ό μ¬μ©νλ μ΄μ λ createQuery λ©μλμ λ λ²μ§Έ μΈμλ‘ κ²°κ³Ό νμ μ μ§μ νμ¬ λ°νλ κ²°κ³Όκ° Dept νμ μΌλ‘ μΊμ€ν λλλ‘ νκΈ° μν¨μ λλ€ -> μ΄λ νμ μμ μ±μ 보μ₯ν©λλ€.
- name νλκ° "Sales"μΈ Dept κ°μ²΄λ₯Ό μ‘°ννλ JPQL 쿼리 μμ :
List<Dept> datas = em.createQuery("select d from Dept d where d.name = :name", Dept.class)
.setParameter("name", "Sales")
.getResultList();
package model.domain.entity;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@AllArgsConstructor
@NoArgsConstructor
@RequiredArgsConstructor
@Getter
@Setter
//@ToString
@Table(name = "emp")
@Entity
public class Emp {
@Id
@Column(name = "empno")
private long empno;
@NonNull
private String ename;
@NonNull
private String job;
@NonNull
private int mgr;
@NonNull
private Date hiredate;
@NonNull
private int sal;
private int comm;
@OneToOne
@JoinColumn(name="deptno")
private Dept deptno;
}

νμ¬ Deptκ°μ²΄λ‘ Selectμ μμ κ°μ μλ¬κ° λ°μνλλ° μ λλκ²μΌκΉμ??
emp ν μ΄λΈμ mgrμ sal 컬λΌμ null κ°μ΄ ν¬ν¨λ κ²μ νμΈν μ μμ΅λλ€. νμ¬ Emp μν°ν°λ₯Ό μμ±ν λ mgrκ³Ό salμ λ°μ΄ν° νμ μ intλ‘ μ€μ νμλλ°, int νμ μ null κ°μ νμ©νμ§ μμ΅λλ€.
λ°λΌμ, λ§μ½ λ°μ΄ν°λ² μ΄μ€μμ mgrμ΄λ salμ΄ nullμΈ κ²½μ°, μν°ν°μμ μ΄λ₯Ό μ²λ¦¬ν μ μκ² λ©λλ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ mgrκ³Ό salμ λ°μ΄ν° νμ μ Integerλ‘ λ³κ²½ν΄μΌ ν©λλ€. Integerλ null κ°μ νμ©νλ λνΌ ν΄λμ€μ΄λ―λ‘,
λ°μ΄ν°λ² μ΄μ€μμ null κ°μ ν¬ν¨ν μ μλ 컬λΌμ μ μ ν μ²λ¦¬ν μ μμ΅λλ€. μ΄ λ³κ²½μ ν΅ν΄ null κ°μ΄ μμ κ²½μ°μλ Emp μν°ν°κ° μ μμ μΌλ‘ λμν μ μκ² λ©λλ€.
- Import λ¬Έμ μ μΈνμμ΅λλ€.
package model.domain.entity;
@AllArgsConstructor
@NoArgsConstructor
@RequiredArgsConstructor
@Getter
@Setter
@ToString
@Table(name = "dept")
@Entity
public class Dept {
@Id
@Column(name = "deptno")
private long deptno;
@NonNull
private String dname;
@NonNull
private String loc;
@OneToMany(mappedBy = "deptno")
private List<Emp> emps = new ArrayList<>();
}
package model.domain.entity;
@AllArgsConstructor
@NoArgsConstructor
@RequiredArgsConstructor
@Getter
@Setter
@ToString
@Table(name = "emp")
@Entity
public class Emp {
@Id
@Column(name = "empno")
private long empno;
@NonNull
private String ename;
@NonNull
private String job;
@NonNull
private int mgr;
@NonNull
private Date hiredate;
@NonNull
private int sal;
private int comm;
@OneToOne
@JoinColumn(name="deptno")
private Dept deptno;
}
public class RunningTest {
@Test
public void stpe01Test() {
EntityManager em = DBUtil.getEntityManager();
Emp emp = em.find(Emp.class, 7782L);
System.out.println("μ¬μ μμ΄λκ° 7782 μ¬λ : " + emp.getEname());
System.out.println("μ¬μ μμ΄λκ° 7782 μ¬λ : " + emp.getEname() + " / λΆμλͺ
: " + emp.getDeptno().getDeptno());
System.out.println("μ¬μ μμ΄λκ° 7782 μ¬λ : " + emp.getDeptno());
Dept dept = em.find(Dept.class, 10L);
System.out.println("λΆμ μμ΄λκ° 10μΈ λΆμ¬ : " + dept.getDname());
List<Emp> emps = dept.getEmps();
emps.forEach(System.out::println);
em = null;
}
}
RunningTest.java μμ System.out.println μΌλ‘ Deptnoλ₯Ό μΆλ ₯νκ³ μ νλ©΄ Stackoverflow errorκ° λ°μν©λλ€. μμΌκΉμ?
μν μ°Έμ‘°
μμΈ : ToStringμΌλ‘ μΈν΄ λ°μνκ² λλ μλ¬μ λλ€.
- Emp κ°μ²΄μ Dept κ°μ²΄κ° μμ΅λλ€.
- Emp κ°μ²΄λ Dept κ°μ²΄λ₯Ό μ°Έμ‘°ν©λλ€ (emp.getDeptno()).
- Dept κ°μ²΄λ μ¬λ¬ Emp κ°μ²΄λ€μ 리μ€νΈλ‘ μ°Έμ‘°ν©λλ€ (dept.getEmps()).
μ¦, Emp κ°μ²΄κ° Dept κ°μ²΄λ₯Ό ν¬ν¨νκ³ , Dept κ°μ²΄κ° λ€μ μ¬λ¬ Emp κ°μ²΄λ€μ ν¬ν¨νλ ꡬ쑰μ λλ€.
emp.toString()μ΄ νΈμΆλλ©΄ Dept κ°μ²΄μ toString()μ΄ νΈμΆλκ³ , μ΄ Dept κ°μ²΄μ toString()μ λ€μ κ·Έ μμ ν¬ν¨λ μ¬λ¬ Emp κ°μ²΄λ€μ toString()μ νΈμΆνκ² λ©λλ€.
μ½κ² νννμλ©΄
emp.toString() -> dept.toString() -> emps.toString() -> λ€μ emp.toString()μΌλ‘ 무νν μννλ©΄μ νΈμΆλ©λλ€.
μ΄λ‘ μΈν΄ StackOverflowErrorμ κ°μ μλ¬κ° λ°μνκ² λλ κ²μ λλ€.
λ ν΄λμ€νμΌ μ€ ν κ³³μ ToString(exclude = )λ‘ μνμ°Έμ‘°κ° λ°μνκ²λλ λ©€λ²λ³μλ₯Ό μ μΈμμΌμ€μλ€. μλ₯Ό λ€μλ©΄ Dept ν΄λμ€μμ ν΄κ²°ν΄μ£Όκ³ μ νλ€λ©΄ @ToString(exclude = "emps")
μμ κ°μ΄ μν μ°Έμ‘°κ° λ°μνκ² λλ empsλ₯Ό μ μΈμμΌμ£Όλ©΄ λ©λλ€.