我在尝试禁用hibernate缓存时遇到很多问题。我正在使用Hibernate 3.2.5与ZK框架和DB2数据库。 Java Web版本是6。 我所做的只是:
1-禁用L2缓存
<property name="hibernate.connection.isolation">2</property>
2 - 更改隔离级别(系统停止使用高于2的级别)
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;
}
3-保存交易我这样做
public static void reOpenSession() {
clearSession();
// flushSession();
clearSession();
closeSession();
getSession();
clearSession();
}
4-在重新开放时会发生这种情况
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;
}
}
5-当我获取List时,我使用setCacheMode(CacheMode.REFRESH),如
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;
}
}
6-这是我宣布课程的方式
<?xml version="1.0" encoding="UTF-8"?>
7-我在这个配置文件中映射hibernate
<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>
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;
}
8-我以这种方式开始我的会议
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();
}
尽管如此,有时在表中的一些更新后,我会读取旧数据值,即使它们在数据库中是正确的。我错过了禁用完整缓存的内容吗?有些结果我无法向用户显示错误的数据,因为它们会弄乱应用程序。
编辑: 也许我的DAO可能有什么问题?
公共课DAO {
{{1}}
}
答案 0 :(得分:0)
逐出方法更改为分离状态.means从会话中删除对象,而不是使用save方法。 我认为以下陈述引起了问题
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);
答案 1 :(得分:0)
经过一番搜索,我找到了问题的根源: 我改变了方法
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;
}