Java hibernate删除第二级jpa2.0

Java hibernate删除第二级jpa2.0,java,hibernate,jpa-2.0,hibernate-cache,Java,Hibernate,Jpa 2.0,Hibernate Cache,我需要在应用程序中删除可缓存表中的所有数据。 我发现要删除所有内容,我必须删除二级缓存,然后使用截断 @Entity @Table(name = "\"cpf_formacode\"") @Cacheable public class CpfRefFormaCode implements Serializable { ....... } Dao方法: public void deleteAll() { SessionFactory sf = em.unwrap(SessionFactor

我需要在应用程序中删除可缓存表中的所有数据。 我发现要删除所有内容,我必须删除二级缓存,然后使用截断

@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>

我最后找到了解决方案, 问题是我试图在删除数据之前清理cach,这不是最佳实践

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);
    }
}

换句话说,flush告诉Hibernate执行将JDBC连接的状态与会话级缓存中保存的对象的状态同步所需的SQL语句。因此,我可以在没有ID问题的情况下保存其他实体

您使用的是什么环境?Jboss论坛上的这个帖子讨论了一个类似的问题,可能与您有关。
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();