2016-06-21 2 views
1

누구나 JPA 제공자 이유를 생각 가지고있다 -는 EclipseLink (버전 2.6.0을 사용)이 같은 쿼리 생성Eclipselink 2.6.0 쿼리의 목적 - SELECT ID FROM TBL WHERE ID =?

SELECT ID FROM OPERATION WHERE (ID = ?); 

또는

SELECT ID FROM SUBSCRIPTION WHERE (ID = ?); 

가 필요한 이유

가 ID를 제공하는 ID를 얻는을 ...

어쩌면 1 단계 또는 2 단계 캐시 동기화가 필요합니까? 어쩌면 내 쿼리가 정확하지 않을 수도 있습니다 ... 내 쿼리에서 나는 이것을 직접 실행하지 않습니다 - JPQL을 사용하고 ID를 제공하는 ID를 요청하지 않습니다.

저는 꽤 복잡한 모델과 쿼리를 가지고 있으므로 전체 코드를 제공하는 데 아무런 요점도 보이지 않습니다 (또는 U가 실제로 주장하는 경우에만 해당하지만 많은 도움이 될 것이라고 생각하지는 않습니다). Oracle 12c DB 사용.

+2

아마도 이러한 쿼리는 주어진 행이 존재하는지 확인하는 것입니다. – antlersoft

+0

당신은 테이블에 매핑 한 것과 쿼리 할 때 무엇을 실행하고 있는지 살펴 봐야 할 것입니다. 가장 빠른 방법은 테이블을 제거하고 스택 추적을 보는 것입니다. 그러나 캐시 동기화와 관련이 없습니다. 데이터베이스가 전체 엔터티를 읽어야하는 경우가 아니라면 캐시와 관련이 없기 때문입니다. – Chris

답변

1

EclipseLink 2.5.2를 사용하여 자바 애플리케이션에서 동일한 문제가 발생했습니다. 특히 M : 1 관계가있는 새로운 엔티티를 다른 엔티티에 삽입 할 때마다이를 보았습니다. 단순화 된 사용 사례는 다음과 같습니다이 경우

A a = new A(); // the new entity 
B b = lookupB(); // get existing entity from database 
a.setB(b); // set M:1 relationship 
em.persist(a); // save 

, 우리는 항상 B에 대한 쿼리를 볼 것이다 (즉, SELECT ID FROM B WHERE ID = @). 몇 가지 연구가 끝나자 레코드를 병합하기 전에 이클립스 링크가 수행하는 existence checking으로 추적했다.

B에 대한 엔터티 클래스에 @ExistenceChecking(ExistenceType.ASSUME_EXISTENCE)이라는 주석을 달면 EclipseLink에서 쿼리를 실행할 수 없습니다.

자세한 내용은 related post을 참조하십시오.