[RESOLVIDO]Problema JPA/Hibernate + Joda Time

5 respostas
S

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:
@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;
	}
}

Alguém saberia me dar um help?

5 Respostas

D

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.

S

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.

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!

D

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.

S

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.

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!

S

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!

Criado 9 de abril de 2013
Ultima resposta 10 de abr. de 2013
Respostas 5
Participantes 2