Problemas com Data, cast

11 respostas
S

Pessoal, não estou conseguindo ler de uma classe através de um método uma data, o que esta errado ? Esta primeira classe gera a data.

import java.util.Calendar;
import java.util.Date;

public class Log {
	private Date dataInclusaoRegistro;

	private Date dataAlteracaoRegistro;

	private Calendar tempoAgora;
	
	private  Date data;

	public Log() {	
	}
	
	Log(Date dataInclusaoRegistro, String nomeInclusaoRegistro,
			Date dataAlteracaoRegistro, String nomeAlteracaoRegistro) {
		tempoAgora();
//		this.dataInclusaoRegistro = tempoAgora.getTime();
//		this.dataAlteracaoRegistro = tempoAgora.getTime();
		this.dataInclusaoRegistro = data;
		this.dataAlteracaoRegistro = data;
		this.nomeAlteracaoRegistro = nomeAlteracaoRegistro;
		this.nomeInclusaoRegistro = nomeInclusaoRegistro;
	}

	private void tempoAgora() {
		tempoAgora = Calendar.getInstance();
		data = tempoAgora.getTime();
	}

	public Date getDataAlteracaoRegistro() {
		return dataAlteracaoRegistro;
	}

	public Date getDataInclusaoRegistro() {
		return dataInclusaoRegistro;
	}

		
	}

Neste segundo eu tento pegar a data, mas ocorreu um cast. stmt.setDate(5, (Date) logDigitalFuncionario .getDataInclusaoRegistro());

11 Respostas

S

Pessoal…será que alguém sabe o que estou fazendo de errado ?
:?

_Renatu

estranho… eu postei a resposta e acho q nao foi :roll:

hehehe bom cara… acho q o problema aí é que vc ta usando o objeto Date de dois packages diferentes…

quando vc usa o Calendar pra retornar um Date, esse Date é do pacote java.util…
e o Date que vc passa para o PreparedStatement é um Date do pacote java.sql

voce pode tentar usar assim ó:

java.util.Date datautil = tempoAgora.getTim();
java.sql.Date datasql = new java.sql.Date(datautil);
//agora vc pode usar esse objeto datasql pra colocar no preparedStatement
//.. bla bla bla
stmt.setDate(5, datasql);

deu pra entender ± ???
nao da pra fazer simplesmente um casting, vc tem q usar o construtor da classe java.sql.Date…

boa sorte!!

S

Beleza Renatu, hoje não vou conseguir fazer o teste, pois estou em casa, mas amanhã as 07:30 a primeira coisa que tentarei será o que vc me passou, de qualquer forma eu atualizarei com a resposta, por enquanto muito obrigado.

S
Gente, não estou conseguindo fazer esta conversão de data para um data que vou utilizar no sql, isto é normal ?? Por exemplo, preciso pegar uma data, hora, minuto,segundo e milesimo de segundo e guardar em um campo Data do banco de dados, em Oracle, fiz as mudanças que o Renato me solicitou mas esta dizendo que: "change type of data to long', segue os código, por favor, help-me.
private java.util.Date data;
	
	private java.sql.Date dataSql;

	public Log() {	
	}
	
	Log(Date dataInclusaoRegistro, String nomeInclusaoRegistro,
			Date dataAlteracaoRegistro, String nomeAlteracaoRegistro) {
		tempoAgora();
//		this.dataInclusaoRegistro = tempoAgora.getTime();
//		this.dataAlteracaoRegistro = tempoAgora.getTime();
		this.dataInclusaoRegistro = dataSql;
		this.dataAlteracaoRegistro = dataSql;
		this.nomeAlteracaoRegistro = nomeAlteracaoRegistro;
		this.nomeInclusaoRegistro = nomeInclusaoRegistro;
	}

	private void tempoAgora() {
	//	tempoAgora = Calendar.getInstance();
		data.getTime();
		dataSql = new java.sql.Date(data);
	//	dataSql = tempoAgora.getTime();
S
Pessoal, fiz umas alterações ele funcionou, mas esta gravando somente a data, eu preciso da hora/min/seg também, como posso fazer? Segue o código.
Calendar data;
	
	private java.sql.Date dataSql;

	public Log() {	
	}
	
	Log(Date dataInclusaoRegistro, String nomeInclusaoRegistro,
			Date dataAlteracaoRegistro, String nomeAlteracaoRegistro) {
		tempoAgora();
		this.dataInclusaoRegistro = dataSql;
		this.dataAlteracaoRegistro = dataSql;
		this.nomeAlteracaoRegistro = nomeAlteracaoRegistro;
		this.nomeInclusaoRegistro = nomeInclusaoRegistro;
	}

	private void tempoAgora() {
		data = Calendar.getInstance();	
		dataSql = new java.sql.Date(data.getTimeInMillis());		
		
	}
S

Pessoal !! alguém pode me ajudar ??

S

Oi Souza, primeiramente obrigado pela força, bem como sou iniciante em java devo estar cometendo muitos erros, mas gostaria de sanar alguns e se vc puder me ajudar eu lhe agradeço, seguinte: O que são classes VOs? Quando vc diz campos de classes vc se refere a criar os campos como locais ? O que vc quer dizer com a sincronizaçao das thread ?

S

Tudo bem Souza, beleza cara, entendi bem o que vc quiz dizer, gostaria de estar lhe agradecendo mais uma vez pela força.

obrigado.

M

Sinval,

Não  erros no código. Ao criar a instancia de um Date, todas as informações sobre o tempo estão no objeto. O problema deve estar relacionado ao tipo do campo no banco e como você está formatando esta data antes de gravá-la. Por exemplo, se o campo no banco está como string e você simplemente manda gravar a data, ele irá utilizar a formatação constante nas configurações regionais do micro. Outra possibilidade é o campo no banco estar realmente como date mas você não está formatando corretamente a saída após recuperar este valor do banco. 

  uma observação:  Esta classe é um VO? Digo isso porque se não for, evite usar campos de classe como você está fazendo com a data. Isso torna a classe threadsafe, ou seja, elimina a chance de desincronização desta quando for acessada por várias threads.
M

SINVAL:
Oi Souza, primeiramente obrigado pela força, bem como sou iniciante em java devo estar cometendo muitos erros, mas gostaria de sanar alguns e se vc puder me ajudar eu lhe agradeço, seguinte:

O que são classes VOs?


VO (Value Object) é um padrão de projeto também conhecido como DTO (Data Transfer Object). Serve apenas para transferência de dados entre classes e não possuem qualquer inteligência. Ou seja, possuem apenas campos de dados e geralmente fazem referência a um registro ou entidade (por exemplo, ClienteVO).


Quando vc diz campos de classes vc se refere a criar os campos como locais ?


Exatamente. Atributos de classe seria a definição mas usada. São os campos private de sua classe.


O que vc quer dizer com a sincronizaçao das thread ?


O que acontece é o seguinte: Em uma aplicação WEB (não sei se é seu caso), cada requisição é comumente associada a uma thread, isto é, uma linha de execução independente. Quando várias threads acessam uma mesma classe simultaneamente, fica evidente o perigo de ocorrer problemas de disputa por recursos compartilhados. Ou seja, se sua classe de log for única e todas as requisições utilizassem esta classe para realizar o log, com certeza daria problemas durante a execução. Um caso muito fácil de acontecer neste caso: Uma requisicao está atribuindo os valores dentro da classe de log, neste instante esta thread é interrompida e esta classe passa a ser usada por outra requisição. O que acontece, quando a primeira thread voltar a usar a classe Log, é que os valores estarão todos trocados, pois foram usados na outra requisição… Não sei se fui claro. Mas se ainda tiver dúvidas pode me escrever.

M

SINVAL:
Tudo bem Souza, beleza cara, entendi bem o que vc quiz dizer, gostaria de estar lhe agradecendo mais uma vez pela força.

obrigado.

Por nada. Só uma correção no que falei acima. As ocorrências da palavra classe na verdade se refere ao objeto, isto é, a uma instância. Quando me referi a uma única classe de log eu quis dizer um único objeto de log. Para o seu caso nunca cair neste problema, basta que você crie um objeto contendo as informações de log sempre que você precisar gravar. Ou seja, Log l = new Log(…) , sempre. Aí não há disputa.

Criado 4 de agosto de 2005
Ultima resposta 9 de ago. de 2005
Respostas 11
Participantes 3