2011-09-20 11 views
5

Wprowadziłem kolumnę "created" do bazy danych mojego użytkownika o nazwie TIMESTAMP MySQL. Próbuję zmapować to do Joda LocalDateTime przy użyciu mappers UserType Hibernate firmy Jadiru. Używam v2.0 z klas UserType i próbowałem z wersji 3.6.0 i 3.6.7 z Hibernate. Używam JDK 1.6. Ta warstwa dostępu do danych jest używana jako część aplikacji internetowej Spring 3.AbstractMethodError podczas korzystania z trwałych typów użytkowników Jadiru Joda/Hibernate

Oto odpowiedni kawałek mojego trwałości obiektu -

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

nic zbyt skomplikowana, ale pojawia się następujący wyjątek, gdy mój UserDAO próbuje kwerendy tabeli -

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) 

próbowałam umieszczanie wszystkich adnotacji na metodach zamiast na polach, ale na tym samym problemie.

Próbowałem również mapowanie różnych typów kolumn, takich jak DATE na LocalDate i TIME na LocalTIME, ale każdy z nich daje podobny błąd.

Inną rzeczą, którą próbowałem, było użycie zapytania kryterialnego zamiast zapytania opartego na szablonie. Nie miało to wpływu na problem.

Sprawdziłem ścieżkę klas dla zduplikowanych bibliotek, które nie wydają się być.

Coś jest nie tak z moją konfiguracją, ponieważ dokumentacja UserType mówi, że to powinno działać. Brak trafień w Google dla tego błędu. Czy ktoś może wskazać mi właściwy kierunek?

Dzięki,

Dan

Odpowiedz

5

nie jest rozwiązaniem, ale wskaźnik/podpowiedź: podpis nullSafeGet wygląda dziwnie. Powinno być

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

ale hibernacji wywołuje nullSafeGet bez parametru SessionImplementor. Tak więc rzeczywista CustomType klasa może zdefiniować abstrakcyjną nullSafeGet metodę, która nie jest realizowany w rzeczywistym implementor PersistentLocalDateTime (który po prostu realizuje sposób z różnymi parametrami)

Może twoja wersje Joda i hibernacji nie są kompatybilne. Zbadam znowu w tym kierunku.

+2

Andreas, Dziękuję za odpowiedź. Byłeś na miejscu - wersja UserType, której używałem (2.0) jest wymieniona jako zgodna z Hibernate 4 w notatkach do wydania. Wyjątek ustępuje, gdy używam wersji 1.9 tej biblioteki, która wydaje się być ostatnią obsługiwaną wersją dla Hibernate 3.6. – danw

+0

Dzięki! miał ten sam problem. Pomogło to zaoszczędzić dużo czasu. –

+0

Witam! Jaki fragment kodu umieściłeś w swoim pom.xml, aby poprawnie zaimportować wersję 1.9? – renatoargh

1

w odpowiedzi na pytanie "Jaki fragment kodu umieściłeś w swoim pliku pom.xml, aby poprawnie zaimportować wersję 1.9?" autor: Renato Gama, spróbuj

<dependency> 
    <groupId>org.jadira.usertype</groupId> 
    <artifactId>usertype.jodatime</artifactId> 
    <version>1.9.1</version> 
</dependency> 
Powiązane problemy