Problema com Hibernate + Oracle

7 respostas
kalinke

Olá pessoal, pesquisei por todo o fórum e o google e não achei algo pra me ajudar. :frowning:

Tenho um sistema em Swing, utilizando Oracle 9i, Genesis, Hibernate e Jboss 4.2.3GA.

Não tenho nenhum erro ou problema com o sistema em 99% dos usuários, o que acontece é que alguns usuários ao consultar informações de pagamento, a data dele sempre vem com 1 dia a menos, ou seja, no banco eu tenho 01/12/2010, na JTable do usuário aparece 31/11/2010 ou as vezes 30/11/2010, já tentei trocar o driver de ojdbc6 para o ojdbc14, já tentei trocar o formato do campo da tabela e no pojo de Date para Timestamp, já tentei atualizar o JVM na máquina e ainda não consigo.

O que uso para mostrar a informação é uma simples JTable com um SimpleDateFormat, copiei todo o meu ambiente para a máquina do usuário para validar e debugando vi que o campo fasttime fica igual ao dá minha máquina.

Será que alguém já teve algum problema parecido ou pode me dar uma luz, não sei mais o que fazer?

Obrigado!

7 Respostas

gilmaslima

Como você está recuperando as datas do banco?

Posta seu código…

kalinke

Esse é o meu objeto:

package br.com.gvt.pojo;

import java.io.Serializable;
import java.util.Date;

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.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "SGD_PAGAMENTOS")
public class Pagamento implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@SequenceGenerator(name = "sgd_seq_pagamentos", sequenceName = "sgd_seq_pagamentos", allocationSize = 1, initialValue = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sgd_seq_pagamentos")
	@Column(name = "id_pagamento")
	private Long id;

	@Column(name = "num_pedido", length = 13)
	private String numPedido;

	@Column(name = "num_nota", length = 13)
	private String numNota;
	
	@Column(name = "num_chamado_enc_contas", length = 12)
	private String numChamadoEncContas;

	@Column(name = "valor")
	private Double valor;

	@Column(name = "valor_ajuste")
	private Double valorAjuste;

	@Column(name = "valor_encontro_contas")
	private Double valorEncontroContas;

	@Column(name = "mes_pertinente")
	@Temporal(TemporalType.TIMESTAMP)
	private Date mesPertinente;

	@Column(name = "data_recebimento")
	private Date dataRecebimentoNota;
	
	@Column(name = "data_devolucao")
	private Date dataDevolucaoNota;

	@Column(name = "data_previsao_pgto")
	private Date dataPrevisaoPgto;

	@Column(name = "data_pgto")
	private Date dataPgto;

	@Column(name = "data_envio_fiscal")
	private Date dataEnvioFiscal;
	
	@Column(name="data_criacao")
	private Date dataCriacao;
	
	@Column(name="data_ultima_alteracao")
	private Date dataUltimaAlteracao;

	@Column(name = "observacao", length = 180)
	private String observacao;
	
	@ManyToOne
	@JoinColumn(name="id_problema_pagamento")
	private ProblemaPagamento problemaPagamento;

	@ManyToOne
	@JoinColumn(name="id_status_pagamento")
	private StatusPagamento statusPagamento;

	@ManyToOne
	@JoinColumn(name="id_cargo_siebel")
	private CargoSiebel cargoSiebel;
	
	@ManyToOne
	@JoinColumn(name="id_tipo_pagamento")
	private TipoPagamento tipoPagamento;
	
	@ManyToOne
	@JoinColumn(name="id_usuario_alteracao")
	private Usuario usuarioAlteracao;

	private String login;
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNumPedido() {
		return numPedido;
	}

	public void setNumPedido(String numPedido) {
		this.numPedido = numPedido;
	}

	public String getNumNota() {
		return numNota;
	}

	public void setNumNota(String numNota) {
		this.numNota = numNota;
	}

	public String getNumChamadoEncContas() {
		return numChamadoEncContas;
	}

	public void setNumChamadoEncContas(String numChamadoEncContas) {
		this.numChamadoEncContas = numChamadoEncContas;
	}

	public Double getValor() {
		return valor;
	}

	public void setValor(Double valor) {
		this.valor = valor;
	}

	public Double getValorAjuste() {
		return valorAjuste;
	}

	public void setValorAjuste(Double valorAjuste) {
		this.valorAjuste = valorAjuste;
	}

	public Double getValorEncontroContas() {
		return valorEncontroContas;
	}

	public void setValorEncontroContas(Double valorEncontroContas) {
		this.valorEncontroContas = valorEncontroContas;
	}

	
	public Date getMesPertinente() {
		return mesPertinente;
	}

	public void setMesPertinente(Date mesPertinente) {
		this.mesPertinente = mesPertinente;
	}

	public Date getDataRecebimentoNota() {
		return dataRecebimentoNota;
	}

	public void setDataRecebimentoNota(Date dataRecebimentoNota) {
		this.dataRecebimentoNota = dataRecebimentoNota;
	}

	public Date getDataDevolucaoNota() {
		return dataDevolucaoNota;
	}

	public void setDataDevolucaoNota(Date dataDevolucaoNota) {
		this.dataDevolucaoNota = dataDevolucaoNota;
	}
	
	public Date getDataPrevisaoPgto() {
		return dataPrevisaoPgto;
	}

	public void setDataPrevisaoPgto(Date dataPrevisaoPgto) {
		this.dataPrevisaoPgto = dataPrevisaoPgto;
	}

	public Date getDataPgto() {
		return dataPgto;
	}

	public void setDataPgto(Date dataPgto) {
		this.dataPgto = dataPgto;
	}
	
	public Date getDataEnvioFiscal() {
		return dataEnvioFiscal;
	}

	public void setDataEnvioFiscal(Date dataEnvioFiscal) {
		this.dataEnvioFiscal = dataEnvioFiscal;
	}

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	public ProblemaPagamento getProblemaPagamento() {
		return problemaPagamento;
	}

	public void setProblemaPagamento(ProblemaPagamento problemaPagamento) {
		this.problemaPagamento = problemaPagamento;
	}

	public StatusPagamento getStatusPagamento() {
		return statusPagamento;
	}

	public void setStatusPagamento(StatusPagamento statusPagamento) {
		this.statusPagamento = statusPagamento;
	}

	public CargoSiebel getCargoSiebel() {
		return cargoSiebel;
	}
	
	public void setCargoSiebel(CargoSiebel cargoSiebel) {
		this.cargoSiebel = cargoSiebel;
	}

	public TipoPagamento getTipoPagamento() {
		return tipoPagamento;
	}
	
	public void setTipoPagamento(TipoPagamento tipoPagamento) {
		this.tipoPagamento = tipoPagamento;
	}
	
	public Date getDataCriacao() {
		return dataCriacao;
	}

	public void setDataCriacao(Date dataCriacao) {
		this.dataCriacao = dataCriacao;
	}

	public Usuario getUsuarioAlteracao() {
		return usuarioAlteracao;
	}

	public void setUsuarioAlteracao(Usuario usuarioAlteracao) {
		this.usuarioAlteracao = usuarioAlteracao;
	}

	public Date getDataUltimaAlteracao() {
		return dataUltimaAlteracao;
	}

	public void setDataUltimaAlteracao(Date dataUltimaAlteracao) {
		this.dataUltimaAlteracao = dataUltimaAlteracao;
	}

	public void setLogin(String login) {
		this.login = login;
	}
	
	public String getLogin() {
		return login;
	}
	
	@Override
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		if (id == null)
			return -1;

		result = PRIME * result + id.intValue();
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Pagamento other = (Pagamento) obj;
		if (id != other.id)
			return false;

		return true;
	}
}

Esse é o HQL que retorna as datas:

@Override
	public List<Pagamento> buscar(Date mesPertinente, Dealer dealer, StatusPagamento statusPagamento, TipoPagamento tipoPagamento, SegmentoNegocio segmentoNegocio, Usuario usuarioLogado) throws DAOException {
		try{
			
			int numPars = 0;
			
			boolean nnP1 = mesPertinente != null;
			boolean nnP2 = dealer != null;
			boolean nnP3 = statusPagamento != null;
			boolean nnP4 = tipoPagamento != null;
			boolean nnP5 = segmentoNegocio != null;
			boolean existeIdSegmento = usuarioLogado.getTipoUsuario().getIdSegmento() != null;					
			
			String sQuery = "from Pagamento as p ";
			
			if(nnP1 || nnP2 || nnP3 || nnP4 || nnP5 || existeIdSegmento)
				sQuery += "where ";
			
			if(nnP1){
				sQuery+= "p.mesPertinente = :mesPertinente ";
				numPars++;
			}
			if(nnP2){
				if(numPars > 0) sQuery += "and ";
				sQuery += "p.cargoSiebel.dealer.id = :idDealer ";
				numPars++;
			}
			if(nnP3){
				if(numPars > 0) sQuery += "and ";
				sQuery += "p.statusPagamento.id = :idStatusPagamento ";
				numPars++;
			}
			if(nnP4){
				if(numPars > 0) sQuery += "and ";
				sQuery += "p.tipoPagamento.id = :idTipoPagamento ";
				numPars++;
			}
			if(nnP5){
				if(numPars > 0) sQuery += "and ";
				sQuery += "p.cargoSiebel.dealer.segmentoNegocio.id = :idSegmentoNegocio ";
				numPars++;
			}
			if(existeIdSegmento){
				if(numPars > 0) sQuery += "and ";
				sQuery += "p.cargoSiebel.dealer.segmentoNegocio.id = :idSegmentoUsuario ";
				numPars++;
			}
			
			Query query = entityManager.createQuery(sQuery);
			
			if(nnP1) query.setParameter("mesPertinente", mesPertinente);
			if(nnP2) query.setParameter("idDealer", dealer.getId());
			if(nnP3) query.setParameter("idStatusPagamento", statusPagamento.getId());
			if(nnP4) query.setParameter("idTipoPagamento", tipoPagamento.getId());
			if(nnP5) query.setParameter("idSegmentoNegocio", segmentoNegocio.getId());
			if(existeIdSegmento) query.setParameter("idSegmentoUsuario", usuarioLogado.getTipoUsuario().getIdSegmento());
			
			return query.getResultList();
		}catch (Exception e) {
			throw new DAOException(e);
		}
	}

Esse é o método que preenche a JTable.

@Action
	@EnabledWhen("form.controleAcesso.visualizar")
	@DataProvider(objectField="pagamento", callOnInit=false)
	public List<Pagamento> populaPagamento() throws DAOException, ParseException {
		try{
			Usuario usuarioLogado = (Usuario)Sessao.get("usuarioLogado");
			Date mes = null;
			if(mesPertinenteFiltro != null)
				mes = df.parse(mesPertinenteFiltro);
					
			
			pagamentos = pagamentoBO.buscar(mes, dealerFiltro, statusPagamentoFiltro,tipoPagamentoFiltro,tipoDealerFiltro, usuarioLogado);
			
			
			
			if(pagamentos.size() < 1){
				throw new RuntimeException("Nenhum registro encontrado!");
			}
			
			calcularValores(pagamentos);
			valorRegistrosEncontrados = pagamentos.size();
			
			
			
		}catch(RuntimeException e){
			Util.ShowInformationMessage(frame, e.getMessage());
		}catch(Exception e){
			throw new RuntimeException(e.getMessage());
		}
		
		return pagamentos;
	}
J

Mas você debugando, viu que o Hibernate retorna isso do banco? Porque assim, se o registro no banco está como 01/12/2010, MUITO dificilmente o Hibernate ia trazer errado. Será que não pode ser a lógica? Aonde exatamente está dando o erro? Será que não é aquele if do mês, que está causando isso?

J

Mas você debugando, viu que o Hibernate retorna isso do banco? Porque assim, se o registro no banco está como 01/12/2010, MUITO dificilmente o Hibernate ia trazer errado. Será que não pode ser a lógica? Aonde exatamente(em que linha) está dando o erro? Será que não é aquele if do mês, que está causando isso?

PS: Fui clicar em editar, acabei clicando em citar

kalinke

Debugando eu vi que ele retorna certo, a questão é que 2 usuários, cada 1 com o mesmo perfil, um tem problema e o outro não. Parece um problema de conversão de data ou algo assim, mas não sei o que. Quando eu populo a minha lista os valores são iguais, mas quando mostra na tela são diferentes…

J

Então, não deve ser problema do Hibernate e sim de Swing, não é melhor pedir para algum moderador trocar o tópico?

Swing já não tenho como te ajudar. Rs

kalinke

Pessoal, desculpa ressuscitar o tópico, mas somente hoje achei a solução do meu problema. Graças a http://www.guj.com.br/java/18070-javautildate---1

O problema era o horário de verão não configurado.

Obrigado!

Criado 20 de maio de 2011
Ultima resposta 18 de jul. de 2011
Respostas 7
Participantes 3