2015-03-10 3 views
0

Мне нужно в моем приложении удалить все данные из таблицы cachable. Я предположил, что для удаления всего содержимого мне пришлось удалить кеш второго уровня, а затем использовать усечение.hibernate удалить второй уровень jpa2.0

@Entity 
@Table(name = "\"cpf_formacode\"") 
@Cacheable 
public class CpfRefFormaCode implements Serializable { 
....... 
} 

метод Dao:

public void deleteAll() { 
    SessionFactory sf = em.unwrap(SessionFactory.class); 
    sf.getCache().evictEntityRegion(CpfRefFormaCode.class); 
    em.createNativeQuery("TRUNCATE TABLE cpf_formacode").executeUpdate(); 
} 

сохранение файла:

 <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> 
      <property name="org.hibernate.FlushMode" value="commit" /> 
      <!-- property name="hibernate.hbm2ddl.auto" value="create-drop"/--> 
      <property name="hibernate.show_sql" value="false" /> 
      <property name="hibernate.cache.use_second_level_cache" value="true" /> 
      <property name="hibernate.cache.use_query_cache" value="true" /> 
      <property name="hibernate.cache.infinispan.cachemanager" value="java:jboss/infinispan/hibernate" /> 
      <property name="hibernate.cache.region.factory_class" value="org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory" /> 
      <property name="hibernate.cache.infinispan.statistics" value="true" /> 
     </properties> 

ошибка у меня есть:

17:50:17,161 ERROR [org.jboss.as.ejb3.tx.CMTTxInterceptor] (http--127.0.0.1-8080-2) javax.ejb.EJBTransactionRolledbackException: Hibernate cannot unwrap interface org.hibernate.SessionFactory 
17:50:17,163 ERROR [org.jboss.ejb3.invocation] (http--127.0.0.1-8080-2) JBAS014134: EJB Invocation failed on component CpfRefFormaCodeDao for method public void com.agefos.corp.business.dao.CpfRefFormaCodeDao.deleteAll(): javax.ejb.EJBTransactionRolledbackException: Hibernate cannot unwrap interface org.hibernate.SessionFactory 
Caused by: javax.persistence.PersistenceException: Hibernate cannot unwrap interface org.hibernate.SessionFactory 
+0

В чем вы работаете? Эта тема на форуме Jboss https://developer.jboss.org/thread/230918?tstart=0 обсуждает аналогичную проблему и может быть актуальной для вас. – djmorton

ответ

0

Я отделан findig решение, проблемачто я пытался очистить кать перед удалением данных, и это была не самая лучшая практика

public void deleteAll() { 
    try { 
     TypedQuery<MyEntity> query = em.createQuery("From MyEntity f", MyEntity.class); 
     query.setHint("org.hibernate.cacheable", true); 
     List<MyEntity> result = null; 
     result = query.getResultList(); 
     if (!result.isEmpty()) { 
      for (MyEntity f : result) { 
       em.remove(f); 
      } 
     } 
     em.flush(); 

    } catch (Exception e) { 
     throw new PersistanceException("An error occurred while attempting to delete an instance of an object : " + entityClass, e); 
    } 
} 

проблема была решена путем добавления

em.flush(); 

Другими словами, вровень говорит Hibernate для выполнения операторы SQL, необходимые для синхронизации состояния соединения JDBC с состоянием объектов, хранящихся в кеше уровня сеанса. так что я был abel для сохранения других объектов без проблем с ID

Смежные вопросы