2011-09-20 10 views
5

He introducido una columna "creada" en la base de datos de MySQL TIMESTAMP de mi usuario. Estoy intentando asignar esto a Joda LocalDateTime usando los mapeadores UserType Hibernate de Jadiru. Estoy usando v2.0 de las clases UserType y lo he intentado con v 3.6.0 y 3.6.7 de Hibernate. Estoy usando JDK 1.6. Esta capa de acceso a datos se usa como parte de una aplicación web Spring 3.AbstractMethodError al utilizar tipos de usuario persistentes Jadiru Joda/Hibernate

Aquí está la parte relevante de mi persistencia de objetos -

@Column(name = "created") 
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime") 
private LocalDateTime created; 

Nada demasiado complicado, pero tengo la siguiente excepción cada vez que mi UserDAO intenta consultar la tabla -

java.lang.AbstractMethodError: org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime.nullSafeGet(Ljava/sql/ResultSet;[Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; 
     at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:109) 
     at org.hibernate.type.AbstractType.hydrate(AbstractType.java:104) 
     at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2283) 
     at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1527) 
     at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1455) 
     at org.hibernate.loader.Loader.getRow(Loader.java:1355) 
     at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:611) 
     at org.hibernate.loader.Loader.doQuery(Loader.java:829) 
     at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) 
     at org.hibernate.loader.Loader.doList(Loader.java:2533) 
     at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) 
     at org.hibernate.loader.Loader.list(Loader.java:2271) 
     at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452) 
     at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363) 
     at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) 
     at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268) 
     at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) 
     at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:921) 
     at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:1) 
     at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) 
     at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 
     at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912) 
     at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:908) 
     at com.vox.dao.UserDAO.getUser(UserDAO.java:27) 
     at com.vox.security.DashboardAuthenticationProcessingFilter.successfulAuthentication(DashboardAuthenticationProcessingFilter.java:30) 
     at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
     at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
     at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
     at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:109) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
     at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:149) 
     at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
     at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
     at java.lang.Thread.run(Thread.java:637) 

He intentado colocando todas las anotaciones en los métodos en lugar de campos, pero el mismo problema.

También intenté mapear diferentes tipos de columna, como DATE a LocalDate y TIME a LocalTIME, pero cada uno arroja un error similar.

Otra cosa que intenté fue utilizar una consulta de criterios en lugar de una consulta basada en plantilla. Esto no afectó el problema.

He comprobado el classpath para las bibliotecas duplicadas, que no parecen ser.

Algo está claramente mal con mi configuración, ya que la documentación de UserType dice que esto debería funcionar. Ningún google acierta por este error en absoluto. Por favor, ¿alguien puede señalarme en la dirección correcta?

Gracias,

Dan

Respuesta

5

No es una solución, sino un puntero/pista: la firma de nullSafeGet parece extraño. Debe ser

public T nullSafeGet(ResultSet resultSet, 
       String[] strings, 
       org.hibernate.engine.spi.SessionImplementor session, 
       Object object) 
      throws SQLException 

pero hibernación llama a un nullSafeGet sin el parámetro SessionImplementor. Por lo que la clase real CustomType podría definir un nullSafeGet método abstracto que no se implementa en el implementador real PersistentLocalDateTime (que simplemente implementa un método con parámetros diferentes)

tal vez sus versiones de joda y de hibernación no son compatibles. Investigaría en esa dirección nuevamente.

+2

Andreas, gracias por su respuesta. Estuviste en lo cierto: la versión de UserType que estaba usando (2.0) aparece como compatible con Hibernate 4 en las notas de la versión. La excepción desaparece cuando uso la versión 1.9 de esta biblioteca, que parece ser la última versión compatible para Hibernate 3.6. – danw

+0

Gracias! tuvo el mismo problema Esto ayudó a ahorrar mucho tiempo. –

+0

¡Hola! ¿Qué parte del código pusiste dentro de tu pom.xml para importar correctamente la versión 1.9? – renatoargh

1

en respuesta a "¿Qué parte de código pusiste dentro de tu pom.xml para importar correctamente la versión 1.9?" por Renato Gama, intente

<dependency> 
    <groupId>org.jadira.usertype</groupId> 
    <artifactId>usertype.jodatime</artifactId> 
    <version>1.9.1</version> 
</dependency> 
Cuestiones relacionadas