2009-12-17 4 views
3

Toplink와 함께 jpa를 구현으로 사용하고 엔티티 목록 새로 고침에 관한 문제가 발생했습니다.엔티티 목록에 대한 최신 데이터 얻기

기본적으로이 시나리오입니다 :

private List<Entity> findAll() 
{ 
    final String sql = "SELECT e from " + anEntityClass.getSimpleName() + " e"; 
    final Query query = itsManager.createQuery(sql); 
    List<Entity> result = query.getResultList(); 

    return result; 
} 

그러나 우리가 외부에 의해 데이터베이스를 수정하는 경우가 캐시에 저장된 정보를 다시 사용하기 때문에, findall은에 두 번째 호출() 메소드는 오래된 정보를 반환합니다. 이 문제에 대한

하나의 해결책은

query.setHint("toplink.refresh", "True"); 

그래서 우리는 항상 상쾌 데이터를 얻을 지정하는 것입니다. 그러나 우리는 Toplink에 의존하고 있으며 공급자를 변경해야하는 경우 문제가 발생할 수 있습니다.

나는 entityManager.refesh() 메소드가 있다는 것을 알고 있지만 entitytManager.find()와 결합하여 하나의 엔티티 만 얻는 것을 보았습니다.

엔티티 목록에 대해 새로운 데이터를 가져 오는 표준 방법이 있습니까?

답변

0

나는 그 속성을 유지할 수 있으며, 지속성 공급자를 변경하면 새로운 속성으로 변경할 수 있다고 생각한다. 나는 그러한 변화가 일어난다면 이것이 적어도 당신의 문제가 될 것이라고 생각합니다.

영구적 단위당 이러한 속성을 설정할 수도 있습니다.

그리고이 시나리오의 범위가 제한되는 경우

0

이것은 JPA 작업의 이러한 좌절 부분이다 (당신이 모든 쿼리에서 세션을 삭제 결국하지 않도록) 당신은 EntityManager.clear()을 사용할 수 있습니다, 나는 생각하고 내가 여러 가지 응용 프로그램에서 어려움을 겪었던 것입니다. 우리가 설정 한 연습은 실제로 세션을 완전히 지우고 결과 세트를 얻은 쿼리를 다시 실행하는 것입니다. refresh() 문제 중 하나는 계단식입니다. 메모리에 불러 온 콜렉션이나 다른 참조를 느리게로드 한 경우 해당 항목이 새로 고쳐 지므로 전체 프로세스가 오랜 시간이 걸릴 수 있습니다.

그러나 필자는 실용주의 측면에서 퍼시스턴스 제공 업체를 변경하는 일이 거의 없다고 말하면서 TopLink에서 작동하는 것이 있다면 바로 사용하십시오. 보유하고있는 도구를 최대한 활용하는 방법을 배우고 Hibernate 또는 다른 것으로 전환해야 할 "언젠가"기회에 대해 걱정하지 마십시오.

1

persistence.xml에서 속성을 설정하여 모든 엔터티 또는 특정 엔터티에 대한 캐싱을 해제 할 수 있습니다.

<persistence-unit name="local" transaction-type="RESOURCE_LOCAL"> 
    <provider>oracle.toplink.essentials.PersistenceProvider</provider> 
    <properties> 
     <property name="toplink.cache.type.default" value="NONE" /> 
     <property name="toplink.cache.type.the.class.package.ClassName" value="NONE" /> 
    </properties> 
</persistence-unit> 

자세한 내용은 http://www.oracle.com/technology/products/ias/toplink/JPA/essentials/toplink-jpa-extensions.html#TopLinkCaching을 참조하십시오.

관련 문제