2012-10-13 4 views
0

:JPQL 대량 삭제 후에 EntityManger를 새로 고치십니까? 내 심/글래스 피쉬/JPA 컨테이너에서 다음과 같은 작업을 실행 한 후

요청 된 열이 성공적으로 나는 SQL 워크 벤치를 사용하여 확인할 수 있습니다 DB에서 삭제 얻을
@ApplicationScoped 
public class JpaGlossaryDataAccessObject implements IGlossaryDataAccessObject { 
    // ... 
    @Transactional 
    public void deleteColumn(String glossaryName, String columnName) { 
     final GlossaryColumn column = getColumn(glossaryName, columnName); 
     entityManager.remove(column); 
    } 
    // ... 
} 

. 그러나 이후에 다음 메서드를 호출 할 때 : 기본적으로 상기 열이 포함 된 용어집을 반환

@ApplicationScoped 
public class JpaGlossaryDataAccessObject implements IGlossaryDataAccessObject { 
    // ... 
    @Transactional 
    public List<Glossary> getGlossaries(Collection<String> glossaryNames) { 
     glossaryNames.retainAll(getGlossaryNames()); 
     return entityManager.createQuery(SELECT_ALL_NAMED_GLOSSARIES, Glossary.class).setParameter(GLOSSARY_NAMES_PARAMETER_INDEX, glossaryNames).getResultList(); 
    } 
    // ... 
} 

을, 삭제 된 열은 용어 객체 아직! 그들은 데이터베이스에 더 이상 존재하지 않지만. 어떻게 이럴 수있어? 이 작업을 수행하기 위해 수행해야 할 몇 가지 추가 새로 고침이 있습니까?

내 beans.xml 환경은 방법으로, 다음과 같습니다 : 그래서

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:s="urn:java:ee" 
    xmlns:security="urn:java:org.jboss.seam.security" xmlns:permission="urn:java:org.jboss.seam.security.permission" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://jboss.org/schema/cdi/beans_1_0.xsd"> 
    <alternatives /> 
    <decorators /> 
    <interceptors> 
     <class>org.jboss.seam.security.SecurityInterceptor</class> 
     <class>org.jboss.seam.transaction.TransactionInterceptor</class> 
    </interceptors> 
    <security:IdentityImpl> 
     <s:modifies /> 
     <security:authenticatorClass>ch.diction.webportal.security.seam.authentication.ChallengeResponseIdmAuthenticatorDecorator 
     </security:authenticatorClass> 
    </security:IdentityImpl> 
</beans> 

, 내가 무엇을 놓치고?

미리 감사와 안부 파스칼

+0

거래 관리자 란 무엇입니까? –

+0

그게 무슨 뜻인지 알고 싶다면 Seam 트랜잭션 인터셉터를 사용하고 있습니다 : org.jboss.seam.transaction.TransactionInterceptor

답변

1

내 첫번째 추측은 당신이 캐시 된 데이터를 시도 할 수 있습니다.

대량 삭제를 수행 한 후 다음 2 개의 캐시를 지우십시오. 없음/캐시의 모든 데이터는 DB와 일치하지 않을 수 있습니다 :

  • EntityManager를 캐시 (즉, 영속 컨텍스트) : entityManager.clear();
  • EntityManagerFactory에 캐시 (즉, 레벨 2 캐시) :
    entityManager.getCache().evictAll();
    OR entityManagerFactory.getCache.evictAll();

이 캐시에있는 모든 단일 개체를 새로 고침 (그러나 실질적으로) 이론적으로는 가능 :

HashMap props = new HashMap(); 
// Semantically, refresh already bypasses the second level cache, no hint required. 
// But this hint says to then store the refreshed value back in the second level cache: 
props.put("javax.persistence.cache.storeMode", CacheStoreMode.REFRESH); 
em.refresh(ent, props); 

하지만 정말 번거롭고 아무런 이점도 없습니다. 첫째, 어떻게 캐시 (들)에 저장된 모든 엔티티를 반복합니까 ?? 둘째, 위에 표시된 단일 호출을 사용하여 호출을 취소하면 필요한 경우 새로 고쳐진 상태로 자동로드됩니다.

JDBC 드라이버가 데이터를 캐싱 할 수도 있습니다. 이는 공급자 및 구성에 따라 다릅니다.

행운이 있나요? = :-)

+0

감사합니다. 한 번에 전체 캐시를 제거하는 대신 모든 캐시 된 엔터티를 새로 고칠 수있는 메커니즘을 설정했습니다. 필자가 빼놓을 수없는 결론은 절대적으로 필요한 경우가 아니라면, 지속 된 시간 동안 활성 퍼시스턴스 컨텍스트에서 엔티티 오브젝트를 유지하지 않고 대신 분리되도록 지정하는 것입니다. –

0

EntityManager의 범위는 영속 컨텍스트는, 당신은 entityManager.clear()를 사용할 수 있습니다. 그렇지

clear() : Clear the persistence context, causing all managed entities to become detached

, 당신은 & 새로운 하나를 오버 헤드가되지 때마다 생성, 처리 한 후 EntityManager을 닫을 수 있습니다. 이 캐시되는 경우

, 당신은 DB와 일치 메모리에 entityManager.getEntityManagerFactory().getCache().evictAll();