[RESOLVIDO]Problema JPA/Hibernate + Joda Time

Bom dia Pessoal!!!

Eu sou iniciante no uso tanto do Hibernate como do Joda Time. Tenho uma classe Usuario, nela defini o atributo ultimoAcesso como org.joda.time.DateTime e coloquei a anotação @Type(type = “org.joda.time.contrib.hibernate.PersistentDateTime”). No meu persistence.xml ja defini minha persistence-unit. Fiz um teste criando uma EntityManagerFactory e tudo funcionou, ele criou a tabela no meu banco certinho(estou usando MySQL). Porém, agora estou tentando buscar um objeto através da minha chave primária usando o método find mas estou recebendo o seguinte erro:

Exception in Application start method Exception in thread "main" java.lang.RuntimeException: Exception in Application start method at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:403) at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47) at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.AbstractMethodError: org.joda.time.contrib.hibernate.PersistentDateTime.nullSafeGet(Ljava/sql/ResultSet;[Ljava/lang/String;Lorg/hibernate/engine/spi/SessionImplementor;Ljava/lang/Object;)Ljava/lang/Object; at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:127) at org.hibernate.type.AbstractType.hydrate(AbstractType.java:106) at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2903) at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1668) at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1600) at org.hibernate.loader.Loader.getRow(Loader.java:1500) at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:712) at org.hibernate.loader.Loader.processResultSet(Loader.java:940) at org.hibernate.loader.Loader.doQuery(Loader.java:910) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:311) at org.hibernate.loader.Loader.loadEntity(Loader.java:2111) at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82) at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72) at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3917) at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:460) at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:429) at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:206) at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:262) at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:150) at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1077) at org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:173) at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2429) at org.hibernate.internal.SessionImpl.get(SessionImpl.java:973) at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:807) at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:781) at br.com.sicoobcredinor.sascfx.dao.UsuarioDao.getUsuario(UsuarioDao.java:26) at br.com.sicoobcredinor.sascfx.SascFx.start(SascFx.java:192) at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319) at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:215) at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179) at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29) at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73) ... 1 more

Abaixo segue minha classe Usuario:

[code]@Entity
@Table(name = “usuarios”)
public class Usuario {
@Id
@Column(name = “LOGIN”)
private String login;

@Column(name = "NOME")
private String nome;

@Column(name = "STATUS")
private boolean status;

@Column(name = "UNIDADE")
private String unidade;

@Column(name = "PERMISSAO")
private String permissao;

@Column(name = "AGENCIA")
private String agencia;

@Column(name = "ULTIMO_ACESSO")
@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime")
private DateTime ultimoAcesso;

public String getLogin() {
	return login;
}

public void setLogin(String login) {
	this.login = login;
}

public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public boolean isStatus() {
	return status;
}

public void setStatus(boolean status) {
	this.status = status;
}

public String getUnidade() {
	return unidade;
}

public void setUnidade(String unidade) {
	this.unidade = unidade;
}

public String getPermissao() {
	return permissao;
}

public void setPermissao(String permissao) {
	this.permissao = permissao;
}

public String getAgencia() {
	return agencia;
}

public void setAgencia(String agencia) {
	this.agencia = agencia;
}

public DateTime getUltimoAcesso() {
	return ultimoAcesso;
}

public void setUltimoAcesso(DateTime ultimoAcesso) {
	this.ultimoAcesso = ultimoAcesso;
}

@Override
public String toString() {
	return "Usuário: " + login;
}

}[/code]

Alguém saberia me dar um help?

E por que não usa um objeto de Calendar ou GregorianCalendar e anota o mesmo como @Temporal?
É muito mais simples e tem o mesmo efeito.
A não ser que você queira realizar coisas mais complexas, não recomendo o uso de JodaTime para isso.

[quote=drsmachado]E por que não usa um objeto de Calendar ou GregorianCalendar e anota o mesmo como @Temporal?
É muito mais simples e tem o mesmo efeito.
A não ser que você queira realizar coisas mais complexas, não recomendo o uso de JodaTime para isso.[/quote]

Apesar de ser iniciante em Java, como estou começando o desenvolvimento desse sistema estou dando preferência para usar as bibliotecas, ferramentas e frameworks mais indicadas pela comunidade, e sempre que começamos estudar Java aprendemos como pode ser “complicado” trabalhar com a API padrão para datas. Não foi necessário muitas pesquisas para ver q a biblioteca mais indicada no momento para trabalhar com datas seria o Joda Time, inclusive há notícias que a nova API de data do futuro Java 8 será fortemente inspirada pelo JodaTime.

http://blog.caelum.com.br/o-eterno-problema-de-calcular-a-diferenca-de-dias-entre-duas-datas-em-java/

http://www.devmedia.com.br/trabalhando-com-joda-time/26524

Mas assim, nada contra a utilização do Calendar, é só mesmo uma opção pessoal!

O problema de começar correndo e não andando é que os tombos são maiores e mais duros.
Para que a JodaTime tenha nascido, alguém usou outros elementos antes dela. Para que o Hibernate tenha sido criado, foram utilizados muitos recursos JDBC antes. Para você aprender a programar, teve de aprender a ler.

[quote=drsmachado]O problema de começar correndo e não andando é que os tombos são maiores e mais duros.
Para que a JodaTime tenha nascido, alguém usou outros elementos antes dela. Para que o Hibernate tenha sido criado, foram utilizados muitos recursos JDBC antes. Para você aprender a programar, teve de aprender a ler.[/quote]

Tenho mais experiência em outras linguagens e antes de me arriscar no mundo Java na prática tomei o cuidado de buscar o mínimo de conhecimento que julgo necessário. Antes desse atual sistema que estou desenvolvendo, desenvolvi um outro e fiz exatamente o que me indicou, comecei andando, usei o Calendar, JDBC, Swing, etc… Porém, agora estou querendo “evoluir” u pouco, adquirir novos conhecimentos e melhorar as minhas aplicações, por isso a escolha pelo Hibernate, Joda Time e JavaFX.
Obrigado pelas dicas!

Encontrei uma solução! Não sei se eh a ideal, mas enquanto não encontrar outra… e fica ai a solução pra quem estiver passando por problema parecido.
Eu estava usando o joda-time-hibernate-1.3.jar para fazer as anotações dos meus atributos do tipo Joda Time, e usava a anotação

, esta foi a maneira que encontrei diversas pessoas da comunidade usando, porém comigo não estava funcionando, talvez seja devido a versão do hibernate que estou usando (4.2.0), mas não encontrei nada q me confirmasse isso. Bem, pesquisando encontrei o usertype.jodatime-2.0.1.jar e com ele passei a usar a anotação

e está funcionando, pelo menos por enquanto.
Mas se alguém souber o real motivo da exception que estava sendo lançada e/ou uma solução mais adequada para o meu problema continuo no aguardo!