Hibernate 3.2.5 无法禁用 Hibernate 缓存

Hibernate 3.2.5 can´t disable Hibernate Cache

我在尝试禁用休眠缓存时遇到了很多问题。我将 Hibernate 3.2.5 与 ZK Framework 和 DB2 数据库一起使用。 Java网页版为6。 我已经做的是:

1- 禁用二级缓存

  <property name="hibernate.cache.use_second_level_cache">false</property>
    <property name="hibernate.cache.use_query_cache">false</property>

    <!-- Disable the second-level cache  -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>     
<property name="cache.region_factory">org.hibernate.cache.impl.NoCachingRegionFactory</property>

2 - 更改隔离级别(系统停止使用高于 2 的级别)

<property name="hibernate.connection.isolation">2</property>

3- 为了保存交易,我这样做

public T invoke(EduPadrao clazz) {
    T classe = null;
    clazz.setDtModificacao(new Date());
    openTransaction();
    try {
        classe = (T) DAO.getSession().merge(clazz);
        saveLog(clazz, (EduPadrao) classe, "S");
        //  DAO.getSession().evict(clazz);
        DAO.getSession().evict(clazz.getClass().getCanonicalName());
        commitTransaction();
        //  System.out.println(clazz.getClass().getCanonicalName());

    } catch (Exception e) {
        StringWriter errors = new StringWriter();
        e.printStackTrace(new PrintWriter(errors));
        Messagebox.show(errors.toString());
        rollBack();
        throw new EmptyStackException();
    } finally {
        DAO.reOpenSession();
    }
    return classe;
}

4- 在重新打开会话时会发生这种情况

public static void reOpenSession() {
    clearSession();
    // flushSession();
    clearSession();
    closeSession();
    getSession();
    clearSession();
  }

5- 当我获取列表时,我使用 setCacheMode(CacheMode.REFRESH) 就像

    public List<T> listar(List<Criterion> restricoes, Order[] order, int init, int max) {    
    Criteria c = DAO.getSession().createCriteria(classe).setCacheMode(CacheMode.REFRESH);
    for (Order o : order) {
        c.addOrder(o);
    }
    List<T> lista = new ArrayList<T>();
    c.setFirstResult(init);
    c.setMaxResults(max);
    try {
        for (Criterion restricao : restricoes) {
            c.add(restricao);
        }
        lista = c.list();
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    } finally {
        System.gc();
        return lista;

    }
}

6- 这就是我声明 class

的方式
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.validator.Size;//import javax.validation.constraints.Size;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.OrderBy;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;


@Entity
@Table(name = "EDU_PRODUTO", schema = "LIVRARIA")
@SQLDelete(sql = "UPDATE LIVRARIA.EDU_PRODUTO SET ST_REGISTRO = 'excluido' WHERE ID_PRODUTO = ?")
@Where(clause = "ST_REGISTRO != 'excluido' OR ST_REGISTRO IS NULL")
public class EduProduto extends EduPadrao {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID_PRODUTO")
    private Integer idProduto;
    @Size(max = 250)
    @Column(name = "LT_EDICAO")
    private String ltEdicao;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "VL_CUSTO")
    private Double vlCusto;
    @Column(name = "VL_VENDA")
    private Double vlVenda;
    @Size(max = 250)
    @Column(name = "LT_TITULO")
    private String ltTitulo;
    @Lob
    @Column(name = "DE_DESCRICAO")
    private String deDescricao;
    @Size(max = 50)
    @Column(name = "NU_ISBN")
    private String nuIsbn;
    @Size(max = 50)
    @Column(name = "NU_LIVRO")
    private String nuLivro;
    @Column(name = "AN_LIVRO")
    private Integer anLivro;
    @Column(name = "TT_PAGINAS")

    private Integer ttPaginas;
    @Size(max = 255)
    @Column(name = "LT_FORMATO")
    private Character ltFormato;
    @Size(max = 255)
    @Column(name = "LT_PALAVRAS_CHAVE")
    private String ltPalavrasChave;
    @Size(max = 50)
    @Column(name = "CD_BARRAS")
    private String cdBarras;
    @Column(name = "NU_LARGURA")
    private Double nuLargura;
    @Column(name = "NU_ALTURA")
    private Double nuAltura;
    @Column(name = "NU_PROFUNDIDADE")
    private Double nuProfundidade;

    @Column(name = "PE_Produto")
    private Double peProduto;
    @Column(name = "QT_ESTOQUE")
    private Integer qtEstoque;
    @Column(name = "FG_PRELO")
    private Character fgPrelo;
    @Column(name = "FG_DIVULGACAO")
    private Character fgDivulgacao;
    @Column(name = "FG_LOJA")
    private Character fgLoja;
    @Column(name = "TP_PRODUTO")
    private Character tpProduto;
    @Size(max = 255)
    @Column(name = "LT_OBS")
    private String ltObs;
    @Size(max = 10)
    @Column(name = "ST_REGISTRO")
    private String stRegistro;
    @Column(name = "LT_ARQUIVO")
    private String ltArquivo;
    @Column(name = "DT_MODIFICACAO")
    @Temporal(TemporalType.DATE)
    private Date dtModificacao;
    @OneToMany(mappedBy = "idProduto")
    @Cascade({CascadeType.ALL})
    @Where(clause = "ST_REGISTRO != 'excluido' OR ST_REGISTRO IS NULL")
    private List<EduProdutoFoto> eduProdutoFotoList;

    @JoinColumn(name = "ID_COLECAO", referencedColumnName = "ID_COLECAO")
    @ManyToOne
    private EduColecao idColecao;
    @JoinColumn(name = "ID_IDIOMA", referencedColumnName = "ID_IDIOMA")
    @ManyToOne
    private EduIdioma idIdioma;
    @OneToMany(mappedBy = "idProduto")

    @Cascade({CascadeType.ALL})
    @Where(clause = "ST_REGISTRO != 'excluido' OR ST_REGISTRO IS NULL")
    @OrderBy(clause = "FG_PRINCIPAL DESC")
    private List<EduProdutoAutor> eduProdutoAutorList;

    @OneToMany(mappedBy = "idProduto")
    @Where(clause = "ST_REGISTRO != 'excluido' OR ST_REGISTRO IS NULL")
    private List<EduPedidoItem> eduPedidoItemList;

    @OneToMany(mappedBy = "idProduto")

    @Cascade({CascadeType.ALL})
    @Where(clause = "ST_REGISTRO != 'excluido' OR ST_REGISTRO IS NULL")
    private List<EduProdutoEditora> eduProdutoEditoraList;

    @OneToMany(mappedBy = "idProduto")
    @Cascade({CascadeType.ALL})
    @Where(clause = "ST_REGISTRO != 'excluido' OR ST_REGISTRO IS NULL")
    private List<EduProdutoTiragem> eduProdutoTiragemList;

    @OneToMany(mappedBy = "idProduto")
    @Cascade({CascadeType.ALL})
    @Where(clause = "ST_REGISTRO != 'excluido' OR ST_REGISTRO IS NULL")
    private List<EduProdutoAreaConhecimento> eduProdutoAreaConhecimentoList;

    @OneToMany(mappedBy = "idProduto")
    @Where(clause = "ST_REGISTRO != 'excluido' OR ST_REGISTRO IS NULL")
    private List<EduPedidoAcerto> eduPedidoAcertoList;

    public Integer getEstoqueTotal() {
        return ControleEstoque.getEstoqueTotalStatic(this);
    }

    public Integer getEstoqueFornecedor(EduPessoa fornecedor) {

        if (fornecedor.getIdPessoa() == null) {
            return ControleEstoque.getEstoqueLivrariaStatic(this);
        } else {
            return ControleEstoque.getEstoqueFornecedorStatic(this, fornecedor);
        }
    }

    public Integer getEstoqueLivraria() {
        return ControleEstoque.getEstoqueLivrariaStatic(this);
    }

    public EduProduto() {
        eduProdutoAutorList = new ArrayList<EduProdutoAutor>();
        eduPedidoItemList = new ArrayList<EduPedidoItem>();
        eduProdutoEditoraList = new ArrayList<EduProdutoEditora>();
        eduProdutoTiragemList = new ArrayList<EduProdutoTiragem>();
        eduProdutoAreaConhecimentoList = new ArrayList<EduProdutoAreaConhecimento>();
        eduPedidoAcertoList = new ArrayList<EduPedidoAcerto>();
    }

    public EduProduto(Integer idProduto) {
        this.idProduto = idProduto;
        eduProdutoAutorList = new ArrayList<EduProdutoAutor>();
        eduPedidoItemList = new ArrayList<EduPedidoItem>();
        eduProdutoEditoraList = new ArrayList<EduProdutoEditora>();
        eduProdutoTiragemList = new ArrayList<EduProdutoTiragem>();
        eduProdutoAreaConhecimentoList = new ArrayList<EduProdutoAreaConhecimento>();
        eduPedidoAcertoList = new ArrayList<EduPedidoAcerto>();
    }

    public Integer getIdProduto() {
        return idProduto;
    }

    public void setIdProduto(Integer idProduto) {
        this.idProduto = idProduto;
    }

    public String getLtEdicao() {
        return ltEdicao;
    }

    public void setLtEdicao(String ltEdicao) {
        this.ltEdicao = ltEdicao;
    }

    public Double getVlCusto() {
        return vlCusto;
    }

    public void setVlCusto(Double vlCusto) {
        this.vlCusto = vlCusto;
    }

    public Double getVlVenda() {
        return vlVenda;
    }

    public void setVlVenda(Double vlVenda) {
        this.vlVenda = vlVenda;
    }

    public String getLtTitulo() {
        return ltTitulo;
    }

    public void setLtTitulo(String ltTitulo) {
        this.ltTitulo = ltTitulo;
    }

    public String getDeDescricao() {
        return deDescricao;
    }

    public void setDeDescricao(String deDescricao) {
        this.deDescricao = deDescricao;
    }

    public String getNuIsbn() {
        return nuIsbn;
    }

    public void setNuIsbn(String nuIsbn) {
        this.nuIsbn = nuIsbn;
    }

    public String getNuLivro() {
        return nuLivro;
    }

    public void setNuLivro(String nuLivro) {
        this.nuLivro = nuLivro;
    }

    public Integer getAnLivro() {
        return anLivro;
    }

    public void setAnLivro(Integer anLivro) {
        this.anLivro = anLivro;
    }

    public Integer getTtPaginas() {
        return ttPaginas;
    }

    public void setTtPaginas(Integer ttPaginas) {
        this.ttPaginas = ttPaginas;
    }

    public Encadernacao getLtFormato() {
        return Encadernacao.getTipoContexto(ltFormato);
    }

    public void setLtFormato(Encadernacao ltFormato) {
        this.ltFormato = ltFormato.getKey();
    }

    public String getLtPalavrasChave() {
        return ltPalavrasChave;
    }

    public void setLtPalavrasChave(String ltPalavrasChave) {
        this.ltPalavrasChave = ltPalavrasChave;
    }

    public String getCdBarras() {
        return cdBarras;
    }

    public void setCdBarras(String cdBarras) {
        this.cdBarras = cdBarras;
    }

    public Double getNuLargura() {
        return nuLargura;
    }

    public void setNuLargura(Double nuLargura) {
        this.nuLargura = nuLargura;
    }

    public Double getNuAltura() {
        return nuAltura;
    }

    public void setNuAltura(Double nuAltura) {
        this.nuAltura = nuAltura;
    }

    public Double getNuProfundidade() {
        return nuProfundidade;
    }

    public void setNuProfundidade(Double nuProfundidade) {
        this.nuProfundidade = nuProfundidade;
    }

    public Integer getQtEstoque() {
        return qtEstoque;
    }

    public void setQtEstoque(Integer qtEstoque) {
        this.qtEstoque = qtEstoque;
    }

    public SimNao getFgPrelo() {
        return SimNao.getTipoContexto(fgPrelo);
    }

    public void setFgPrelo(SimNao fgPrelo) {
        this.fgPrelo = fgPrelo.getKey();
    }

    public SimNao getFgDivulgacao() {
        return SimNao.getTipoContexto(fgDivulgacao);
    }

    public void setFgDivulgacao(SimNao fgDivulgacao) {
        this.fgDivulgacao = fgDivulgacao.getKey();
    }

    public SimNao getFgLoja() {
        return SimNao.getTipoContexto(fgLoja);
    }

    public void setFgLoja(SimNao fgLoja) {
        this.fgLoja = fgLoja.getKey();
    }

    public TipoProduto getTpProduto() {
        return TipoProduto.getTipoContexto(tpProduto);
    }

    public void setTpProduto(TipoProduto tpProduto) {
        this.tpProduto = tpProduto.getKey();
    }

    public String getLtObs() {
        return ltObs;
    }

    public void setLtObs(String ltObs) {
        this.ltObs = ltObs;
    }

    public String getStRegistro() {
        return stRegistro;
    }

    public void setStRegistro(String stRegistro) {
        this.stRegistro = stRegistro;
    }

    public Date getDtModificacao() {
        return dtModificacao;
    }

    public void setDtModificacao(Date dtModificacao) {
        this.dtModificacao = dtModificacao;
    }

    public List<EduProdutoFoto> getEduProdutoFotoList() {
        return eduProdutoFotoList;
    }

    public void setEduProdutoFotoList(List<EduProdutoFoto> eduProdutoFotoList) {
        this.eduProdutoFotoList = eduProdutoFotoList;
    }

    public EduColecao getIdColecao() {
        return idColecao;
    }

    public void setIdColecao(EduColecao idColecao) {
        this.idColecao = idColecao;
    }

    public EduIdioma getIdIdioma() {
        return idIdioma;
    }

    public void setIdIdioma(EduIdioma idIdioma) {
        this.idIdioma = idIdioma;
    }

    public String getLtArquivo() {
        return ltArquivo;
    }

    public void setLtArquivo(String ltArquivo) {
        this.ltArquivo = ltArquivo;
    }

    public List<EduProdutoAutor> getEduProdutoAutorList() {
        return eduProdutoAutorList;
    }

    public void setEduProdutoAutorList(List<EduProdutoAutor> eduProdutoAutorList) {
        this.eduProdutoAutorList = eduProdutoAutorList;
    }

    public Double getPeProduto() {
        return peProduto;
    }

    public void setPeProduto(Double peProduto) {
        this.peProduto = peProduto;
    }

    public List<EduProdutoEditora> getEduProdutoEditoraList() {
        return eduProdutoEditoraList;
    }

    public void setEduProdutoEditoraList(List<EduProdutoEditora> EduProdutoEditoraList) {
        this.eduProdutoEditoraList = EduProdutoEditoraList;
    }

    public List<EduProdutoTiragem> getEduProdutoTiragemList() {
        return eduProdutoTiragemList;
    }

    public void setEduProdutoTiragemList(List<EduProdutoTiragem> eduProdutoTiragemList) {
        this.eduProdutoTiragemList = eduProdutoTiragemList;
    }

    public List<EduProdutoAreaConhecimento> getEduProdutoAreaConhecimentoList() {
        return eduProdutoAreaConhecimentoList;
    }

    public void setEduProdutoAreaConhecimentoList(List<EduProdutoAreaConhecimento> eduProdutoAreaConhecimentoList) {
        this.eduProdutoAreaConhecimentoList = eduProdutoAreaConhecimentoList;
    }

    public List<EduPedidoAcerto> getEduPedidoAcertoList() {
        return eduPedidoAcertoList;
    }

    public void setEduPedidoAcertoList(List<EduPedidoAcerto> eduPedidoAcertoList) {
        this.eduPedidoAcertoList = eduPedidoAcertoList;
    }

    public List<EduPedidoItem> getEduPedidoItemList() {
        return eduPedidoItemList;
    }

    public void setEduPedidoItemList(List<EduPedidoItem> eduPedidoItemList) {
        this.eduPedidoItemList = eduPedidoItemList;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 97 * hash + (this.idProduto != null ? this.idProduto.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final EduProduto other = (EduProduto) obj;
        if (this.idProduto != other.idProduto && (this.idProduto == null || !this.idProduto.equals(other.idProduto))) {
            return false;
        }
        return true;
    }

}

7- 我在这个配置文件中映射休眠模式

<?xml version="1.0" encoding="UTF-8"?>

    <property name="dialect">org.hibernate.dialect.DB2Dialect</property>
    <property name="hibernate.connection.driver_class">com.ibm.db2.jcc.DB2Driver</property>


    <property name="hibernate.connection.url">jdbc:db2://localhost:50000/database</property> 
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">mypassword</property>  


    <property name="hibernate.current_session_context_class">managed</property>

    <property name="hibernate.cache.use_second_level_cache">false</property>
    <property name="hibernate.cache.use_query_cache">false</property>
    <property name="cache.region_factory">org.hibernate.cache.impl.NoCachingRegionFactory</property>


    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>     

    <property name="show_sql">true</property>

   <property name="hibernate.connection.isolation">2</property>


    <mapping class="EduProduto"/>
oUsuario"/>

</session-factory>

8- 我以这种方式开始我的会话

   public static Session getSession() {
    Session session = (Session) DAO.session.get();
    if (session == null) {
        session = HibernateUtil.getInstance().getSessionFactory().openSession();
        session.getSessionFactory().evict(EduProduto.class);
        session.setCacheMode(CacheMode.REFRESH);
session.setFlushMode(FlushMode.ALWAYS);
        DAO.session.set(session);
        //Messagebox.show("CAIU AQUI"); 
        //System.out.println("CAIU AQUI");
    }

    return session;
}

不过,有时在 table 中进行一些更新后,我会读取旧数据值,即使它们在数据库中是正确的。我是否缺少禁用完整缓存的内容?有些结果我不能向用户显示错误的数据,因为它们会弄乱应用程序。

编辑: 也许我的 DAO 有什么问题?

public class DAO {

private static final ThreadLocal session = new ThreadLocal();

public DAO(Class classe) {

}

public static Session getSession() {
    Session session = (Session) DAO.session.get();
    if (session == null) {
        session = HibernateUtil.getInstance().getSessionFactory().openSession();
        //session.getSessionFactory().evict(EduProduto.class);
        session.setCacheMode(CacheMode.REFRESH);
        session.setFlushMode(FlushMode.ALWAYS);
        DAO.session.set(session);
        //Messagebox.show("CAIU AQUI"); 
        //System.out.println("CAIU AQUI");
    }

    return session;
}

public static void clearSession() {
    getSession().clear();
}

public static boolean isTransactionOpen() {
    if (getSession().getTransaction().isActive()) {
        return true;
    }
    return false;
}

public static void abrirTransaction() {
    if (!isTransactionOpen()) {
        getSession().beginTransaction().begin();
    }
}

public static void commitTransaction() {
    flushSession();
    getSession().getTransaction().commit();

}

public static void rollBack() {
    getSession().getTransaction().rollback();
}

public static void closeSession() {
    getSession().close();
    DAO.session.set(null);
}

public static void flushSession() {
    getSession().flush();
}

public static void reOpenSession() {
    //  clearSession();
    // flushSession();
    clearSession();
    closeSession();
    getSession();
    // clearSession();
    //    flushSession();
}

}

evict 方法更改为分离 state.means 从会话中删除对象,而不是使用保存方法。 我认为以下语句导致了问题

DAO.getSession().evict(clazz.getClass().getCanonicalName());

 session.getSessionFactory().evict(EduProduto.class);

去掉这个,替换成save(),你的问题就解决了。

例如:

session.beginTransaction();
        Stock stock = new Stock();

        stock.setStockCode("k0923");
        stock.setStockName("elias");

        session.save(stock);

经过更多的搜索,我找到了问题的根源: 我改变了方法

private static final ThreadLocal session = new ThreadLocal();

public static Session getSession() {
    Session session = (Session) DAO.session.get();
    if (session == null) {
        session = HibernateUtil.getInstance().getSessionFactory().openSession();
        //session.getSessionFactory().evict(EduProduto.class);
        session.setCacheMode(CacheMode.REFRESH);
        session.setFlushMode(FlushMode.ALWAYS);
        DAO.session.set(session);
        //Messagebox.show("CAIU AQUI"); 
        //System.out.println("CAIU AQUI");
    }

    return session;
}

现在是:

private Session session;


 public Session getSession() {
    if (session == null || !session.isOpen()) {
        session = HibernateUtil.getInstance().getSessionFactory().openSession();
    }
    return session;
}