vRaptor + Hibernate + JodaTime = problemas com tipo TIME / LocalTime [ RESOLVIDO ]

Olá!

Estou trabalhando com: vRaptor e Hibernate

Pesquisei sobre conversores para Joda Time:
Segundo que li na página da caelum/vraptor: http://vraptor.caelum.com.br/documentacao/spring-joda-time-hibernate/

Neste sentido fiz a implementação com Joda Time com a versão: joda-time-2.0 e joda-time-hibernate-1.2

Estou usando a classe “org.joda.time.LocalTime” com o @Type(type = “org.joda.time.contrib.hibernate.PersistentLocalTimeAsTime”)
para trabalhar com campos do tipo TIME (HORA)
Porém percebi que o valor exibido na tela é diferente do valor do banco de dados.
ou seja,
no banco de dados o campo do tipo TIME, a hora está armazenada com o valor 07:00h e o JodaTime mostra na tela 10:00h, ocorre uma variação de -3 horas
inclusive, debugando o JodaTime mostra o valor 10:00h e no banco está 07:00h

Conferi o timezone, e está correto.

Alguém poderia dar alguma sugestão de como poderia fazer para o JodaTime mostrar exatamente o valor que está armazenado no banco de dados?
Será alguma configuração do vRaptor?

Att,

Marcelo Yukio Outa
Analista de Sistemas // Programador Java Web

será que no banco não está salvo com GMT 0?

PS: não tem nada a ver com o vraptor

Bom dia!

Lucas, obrigado pelo feedback. :slight_smile:
Desculpe a demora pela resposta…
Fiquei encarregado de outro projeto e logo sai de férias… Agora que voltei a trabalhar com este assunto…

Mãos a obra:

  • Não é no banco nem na aplicação: Verifiquei o banco de dados, inclusive testei no postgresql, oracle, mysql e todos apresentam a mesma situação…
  • Realmente não tem nada a ver com o vRaptor… rsrs

Pelo que pesquisei… no JODATIME há duas possibilidades para se trabalhar com o tipo TIME (horas):
@Type(type = “org.joda.time.contrib.hibernate.PersistentLocalTimeAsTime”)
@Type(type = “org.joda.time.contrib.hibernate.PersistentLocalTimeAsString”)
… com PersistentLocalTimeAsTime temos o problema da variação do UTC/GMT time, que dependendo do lugar onde se está no mundo, o jodatime faz o desconto/adição dessa diferença de horas >>> BUG DO JODATIME <<<.
… com PersistentLocalTimeAsString temos o problema ao gravar o registro no banco, pois no banco o campo é do tipo time without time zone… nesse caso o framework não consegue realizar o CAST do valor “PersistentLocalTimeAsString” para o tipo correto.

Felizmente…
Depois de árduas e cansativas pesquisas… hehehehe
encontrei o seguinte na documentação da Jadira Usertype (org.jadira.usertype.dateandtime.joda.PersistentLocalTime: http://www.jarvana.com/jarvana/view/org/jadira/usertype/usertype.jodatime/1.3/usertype.jodatime-1.3-javadoc.jar!/index.html?org/jadira/usertype/dateandtime/joda/PersistentLocalTime.html):

SOLUÇÃO!!! :idea:
Basta adicionar ao classpath a lib da Jadira Usertype (http://usertype.sourceforge.net/ http://blog.jadira.co.uk/ )
e usar: @Type(type = “org.jadira.usertype.dateandtime.joda.PersistentLocalTime”) no seu campo persistente…

Espero que ajude outras pessoas que possuam algum problema parecido.

Obrigado!

Ou então você pode usar a classe PersistentDateTimeTZ, que está no mesmo jar do JodaTime-Hibernate, que armazena junto o Timezone.

Basta ler os docs :wink: