JPA+Vraptor+JodaTime

Boa tarde Pessoal, estou com problema com datas, até essa semana eu utilizava hibernate puro, agora estou usando JPA depois que fiz alteração tive alguns problemas mas já resolvi, só não estou conseguindo resolver esse problema de data, segue as minha classe.

eu utilizo o Jodatime pois no postgres ele armazena data YYYY-MM-DD
e eu quero no formato DD/MM/YYYY

quando eu utilizava o hibernate puro funcionava normalmente, acredito que alguma problema entre o jodatime e JPA.

Pessoa.java

package br.com.coliseu.model;

// Generated 18/06/2011 09:46:05 by Hibernate Tools 3.4.0.CR1

import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.Type;
import org.joda.time.LocalDate;

/**
 * Pessoa generated by hbm2java
 */
@Entity
@Table(name = "pessoa", schema = "coliseusys")
@SequenceGenerator(name = "coliseusys.gen_idpessoa", sequenceName = "coliseusys.gen_idpessoa")
public class Pessoa implements java.io.Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int idpessoa;
	...
	private LocalDate dtnasc;
	private BigDecimal rendafamiliar;
	private LocalDate dtcadastro;
	...

	

	@Type(type = "org.joda.time.contrib.hibernate.PersistentLocalDate")
	@Column(name = "dtnasc", length = 13)
	public LocalDate getDtnasc() {
		return this.dtnasc;
	}

	public void setDtnasc(LocalDate dtnasc) {
		this.dtnasc = dtnasc;
	}

	@Column(name = "rendafamiliar", precision = 10)
	public BigDecimal getRendafamiliar() {
		return this.rendafamiliar;
	}

	public void setRendafamiliar(BigDecimal rendafamiliar) {
		this.rendafamiliar = rendafamiliar;
	}

	@Type(type = "org.joda.time.contrib.hibernate.PersistentLocalDate")
	@Column(name = "dtcadastro", length = 13)
	public LocalDate getDtcadastro() {
		return this.dtcadastro;
	}

	....
}

Erro:

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.NoSuchFieldError: DATE
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:89)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
root cause

java.lang.NoSuchFieldError: DATE
	org.joda.time.contrib.hibernate.PersistentLocalDate.nullSafeGet(PersistentLocalDate.java:70)
	org.joda.time.contrib.hibernate.PersistentLocalDate.nullSafeGet(PersistentLocalDate.java:65)
	org.hibernate.type.CustomType.nullSafeGet(CustomType.java:109)
	org.hibernate.type.AbstractType.hydrate(AbstractType.java:104)
	org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2283)
	org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1527)
	org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1455)
	org.hibernate.loader.Loader.getRow(Loader.java:1355)
	org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:611)
	org.hibernate.loader.Loader.doQuery(Loader.java:829)
	org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
	org.hibernate.loader.Loader.doList(Loader.java:2533)
	org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
	org.hibernate.loader.Loader.list(Loader.java:2271)
	org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)
	org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
	org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
	org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
	org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
	org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:246)
	br.com.coliseu.business.common.GenericBusiness.getTotalRecords(GenericBusiness.java:140)
	br.com.coliseu.controller.PessoaController.pessoa(PessoaController.java:68)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:616)
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:89)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

o jodatime-hibernate usa algumas constantes deprecated do Hibernate, que foram removidas na versão 3.6 (ou 3.5, não lembro).

o que eu fiz pra resolver foi copiar o código fonte do PersistentLocalDate para o meu projeto, e alterar as constantes pelo jeito novo de fazer.

ou vc pode fazer um downgrade do hibernate tb (ruim)

Como eu faço para copiar o código fonte do PersistentLocalDate alterar as constantes, se tiver algum documento de como faço para resolver isso, e puder me passa, ou coisa assim…

Obeigado!

no caso eu deveria manter a biblioteca do jodatime

e colocar esse código no meu projeto com as alterações? e quais seriam essas alterações?

/*
 *  Copyright 2001-2009 Stephen Colebourne
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.joda.time.contrib.hibernate;

import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.usertype.EnhancedUserType;
import org.joda.time.LocalDate;

/**
 * Persist {@link org.joda.time.LocalDate} via hibernate.
 * 
 * @author Mario Ivankovits (mario@ops.co.at)
 */
public class PersistentLocalDate implements EnhancedUserType, Serializable {

    public static final PersistentLocalDate INSTANCE = new PersistentLocalDate();

    private static final int[] SQL_TYPES = new int[] { Types.DATE, };

    public int[] sqlTypes() {
        return SQL_TYPES;
    }

    public Class returnedClass() {
        return LocalDate.class;
    }

    public boolean equals(Object x, Object y) throws HibernateException {
        if (x == y) {
            return true;
        }
        if (x == null || y == null) {
            return false;
        }
        LocalDate dtx = (LocalDate) x;
        LocalDate dty = (LocalDate) y;
        return dtx.equals(dty);
    }

    public int hashCode(Object object) throws HibernateException {
        return object.hashCode();
    }

    public Object nullSafeGet(ResultSet resultSet, String[] strings, Object object) throws HibernateException, SQLException {
        return nullSafeGet(resultSet, strings[0]);

    }

    public Object nullSafeGet(ResultSet resultSet, String string) throws SQLException {
        Object timestamp = Hibernate.DATE.nullSafeGet(resultSet, string);
        if (timestamp == null) {
            return null;
        }
        return new LocalDate(timestamp);
    }

    public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) throws HibernateException, SQLException {
        if (value == null) {
            Hibernate.DATE.nullSafeSet(preparedStatement, null, index);
        } else {
            Hibernate.DATE.nullSafeSet(preparedStatement, ((LocalDate) value).toDateTimeAtStartOfDay().toDate(), index);
        }
    }

    public Object deepCopy(Object value) throws HibernateException {
        return value;
    }

    public boolean isMutable() {
        return false;
    }

    public Serializable disassemble(Object value) throws HibernateException {
        return (Serializable) value;
    }

    public Object assemble(Serializable cached, Object value) throws HibernateException {
        return cached;
    }

    public Object replace(Object original, Object target, Object owner) throws HibernateException {
        return original;
    }

    public String objectToSQLString(Object object) {
        throw new UnsupportedOperationException();
    }

    public String toXMLString(Object object) {
        return object.toString();
    }

    public Object fromXMLString(String string) {
        return new LocalDate(string);
    }

}

exato, copia isso no seu projeto, e no @Type vc coloca a sua classe ao invés da original

ah, as alterações são: tudo que parar de compilar, vc troca pelo novo jeito :wink:

procura o javadoc da classe Hibernate dos hibernates mais antigos, ele vai falar qual é o jeito certo de chamar os caras deprecated

Lucas ou alguém saberia me sugerir um outra forma de eu formatar a minha Data, pois ela retorna do postgres YYYY-MM-DD e eu gostaria que fosse apresentada dessa forma DD/MM/YYYY.

obrigado!

se vc colocou o campo como Date (ou Calendar) no java, não tem importância como isso está representado no banco,

vc pode formatar no java do jeito normal (usando DateFormat, ou <fmt:formatDate, por exemplo)