2016-07-07 3 views
1

코드 간의 차이점은 무엇입니까?@OneToMany (EAGER) vs @LazyCollection (FALSE) & OneToMany (LAZY)

@LazyCollection(LazyCollectionOption.FALSE) 
@OneToMany(mappedBy = "siteesTypeSite", cascade = CascadeType.ALL,fetch = FetchType.LAZY) 
public Set<Sites> getSitees() { 
    return sitees; 
} 

그 중 나에게 모두로

@OneToMany(mappedBy = "siteesTypeSite", cascade = CascadeType.ALL,fetch = FetchType.EAGER) 
public Set<Sites> getSitees() { 
    return sitees; 
} 

비슷한 결과를 만들지 만, 두 번째 경우는 더 깨끗합니다. 내가 실수 한 경우에 제발.

답변

2

주석 간의 주요 차이점은 @OneToMany이 순수한 JPA 주석입니다. 반면 @LazyCollection은 최대 절전 모드입니다.

그래서 다양한 JPA 제공자간에 코드를 이식 가능하게하려면 JPA 주석을 사용해야합니다.

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) 
@JoinColumn(name = "DEPARTMENT_ID") 
private List<Employee> employees = new ArrayList<>(); 

당신이 사용하는 DB에서 Department 개체를 가져 오는 경우 :

업데이트

두 주석 사이에 설명하기 위해, Department -> Employee 사이의 OneToMany 관계

사례 1을 고려 :

entityManager.find(Department.class, 1L); 

다음 쿼리는

SELECT department0_.DEPARTMENT_ID AS DEPARTMENT_ID1_0_0_, 
    department0_.DEPARTMENT_NAME AS DEPARTMENT_NAME2_0_0_, 
    department0_.LOCATION   AS LOCATION3_0_0_, 
    employees1_.DEPARTMENT_ID  AS DEPARTMENT_ID3_1_1_, 
    employees1_.EMPLOYEE_ID   AS EMPLOYEE_ID1_1_1_, 
    employees1_.EMPLOYEE_ID   AS EMPLOYEE_ID1_1_2_, 
    employees1_.DEPARTMENT_ID  AS DEPARTMENT_ID3_1_2_, 
    employees1_.EMPLOYEE_NAME  AS EMPLOYEE_NAME2_1_2_ 
FROM DEPARTMENT department0_ 
LEFT OUTER JOIN EMPLOYEE employees1_ 
ON department0_.DEPARTMENT_ID =employees1_.DEPARTMENT_ID 
WHERE department0_.DEPARTMENT_ID=? 

그래서 그것이 한 번에 하나의 쿼리에서 모든 데이터를 가져 오는 것을 의미합니다 데이터

를 가져 발사됩니다.

사례 2 :

entityManager.find(Department.class, 1L); 

다음 쿼리를 발사됩니다 데이터 가져 :

SELECT department0_.DEPARTMENT_ID AS DEPARTMENT_ID1_0_0_, 
    department0_.DEPARTMENT_NAME AS DEPARTMENT_NAME2_0_0_, 
    department0_.LOCATION   AS LOCATION3_0_0_ 
FROM DEPARTMENT department0_ 
WHERE department0_.DEPARTMENT_ID=? 

SELECT employees0_.DEPARTMENT_ID AS DEPARTMENT_ID3_1_0_, 
    employees0_.EMPLOYEE_ID  AS EMPLOYEE_ID1_1_0_, 
    employees0_.EMPLOYEE_ID  AS EMPLOYEE_ID1_1_1_, 
    employees0_.DEPARTMENT_ID  AS DEPARTMENT_ID3_1_1_, 
    employees0_.EMPLOYEE_NAME  AS EMPLOYEE_NAME2_1_1_ 
FROM EMPLOYEE employees0_ 
WHERE employees0_.DEPARTMENT_ID=? 

@LazyCollection(LazyCollectionOption.FALSE) 
@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY, orphanRemoval = true) 
@JoinColumn(name = "DEPARTMENT_ID") 
private List<Employee> employees = new ArrayList<>(); 

similary 당신이 사용하는 DB에서 부서 객체를 가져올 경우

요약하자면, FetchType이 쿼리에 Department과 함께 열심히 인출되어 이 이기 때문에 첫 번째 경우에 요약하면됩니다.

그리고, 두 번째 경우

, EmployeesDepartment으로 페치되지만 FetchType 때문에 별도 쿼리 Employees을 가져 소성한다 LAZY이다. 그리고 @LazyCollection(LazyCollectionOption.FALSE)Employees을 제거하면 EmployeesDepartment 인스턴스에 액세스 할 때까지 전혀 가져올 수 없습니다.

+0

질문에 대한 답변입니까? ** 코드 간의 차이점은 무엇입니까? ** – Sergii

+0

어떤 상황에서 차이가 필요합니까? @Sergii – eatSleepCode

+0

농담입니까? 프로그램에 첫 번째 코드를 적용하고 프로그램의 다른 부분을 적용하면 어떤 결과가 있어야합니까[email protected] _ 나를 위해 두 사람이 비슷한 결과를 만듭니다. – Sergii