2013-04-20 10 views
7

Co powoduje ten wyjątek, nie mogę się dowiedzieć.Co przyczyną org.hibernate.PropertyAccessException: Wystąpił wyjątek wewnątrz settera

Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Exception occurred inside setter of my.Class 

głównej przyczyny:

javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Exception occurred inside setter of my.Class 

Kod:

@ManyToMany(fetch = FetchType.EAGER) 
public void setTags(Set<Tags> tags) { 
    this.tags.clear(); 

    for (Tag tag : tags) { 
     addTag(tag); 
    } 
} 


public boolean addTag(final Tag tag) { 
    if (tags.contains(tag)) { 
     return false; 
    } 

    return tags.add(tag); 
} 

I initalize tagi w konstruktorze:

tags = new HashSet<Tag>(); 

EDIT

Wyjątek logowania metodą nastawczym:

ax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Exception occurred inside setter of com.mycompany.domain.Book.Tags 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:838) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:781) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:201304051638] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:201304051638] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:201304051638] 
    at java.lang.reflect.Method.invoke(Method.java:601) ~[na:1.7.0] 
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) ~[spring-orm-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    at $Proxy215.find(Unknown Source) ~[na:na] 
    at com.mycompany.persistence.BookJpaRepository.get(BookJpaRepository.java:22) ~[classes/:na] 
    at com.mycompany.service.BookService.getBook(BookService.java:44) ~[classes/:na] 
    at com.mycompany.service.BookService$$FastClassByCGLIB$$d6b91ae6.invoke(<generated>) ~[BookService$$FastClassByCGLIB$$d6b91ae6.class:na] 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698) ~[spring-aop-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) ~[spring-aop-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) ~[spring-tx-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631) ~[spring-aop-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at com.mycompany.service.BookService$$EnhancerByCGLIB$$e6a4e1a3.getBook(<generated>) ~[BookService$$EnhancerByCGLIB$$e6a4e1a3.class:na] 
    at com.mycompany.rest.controller.BookController.getFeedbackForBook(BookController.java:106) ~[classes/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:201304051638] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:201304051638] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:201304051638] 
    at java.lang.reflect.Method.invoke(Method.java:601) ~[na:1.7.0] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) ~[spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) ~[spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) ~[spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) ~[spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) ~[spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) ~[spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) ~[spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) ~[spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:920) [spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:816) [spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) [javax.servlet-api.jar:3.0.1] 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:801) [spring-webmvc-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) [javax.servlet-api.jar:3.0.1] 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:175) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.core.StandardHostValve.__invoke(StandardHostValve.java:161) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) [web-core.jar:3.1.2.1-SNAPSHOT] 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) [kernel.jar:3.1.2.1-SNAPSHOT] 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) [kernel.jar:3.1.2.1-SNAPSHOT] 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) [grizzly-http.jar:1.9.50] 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) [grizzly-http.jar:1.9.50] 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) [grizzly-http.jar:1.9.50] 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) [grizzly-http.jar:1.9.50] 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) [grizzly-framework.jar:1.9.50] 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) [grizzly-framework.jar:1.9.50] 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) [grizzly-framework.jar:1.9.50] 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) [grizzly-http.jar:1.9.50] 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) [grizzly-framework.jar:1.9.50] 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) [grizzly-framework.jar:1.9.50] 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) [grizzly-framework.jar:1.9.50] 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) [grizzly-utils.jar:1.9.50] 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) [grizzly-utils.jar:1.9.50] 
    at java.lang.Thread.run(Thread.java:722) [na:1.7.0] 
Caused by: org.hibernate.PropertyAccessException: Exception occurred inside setter of com.mycompany.domain.Book.Tags 
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:88) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:710) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:371) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:4499) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:185) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:137) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1103) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.Loader.processResultSet(Loader.java:960) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.Loader.doQuery(Loader.java:910) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:311) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.Loader.loadEntity(Loader.java:2111) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3917) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:460) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:429) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:206) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:262) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:150) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1091) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:174) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2473) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:987) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:807) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final] 
    ... 61 common frames omitted 
Caused by: java.lang.reflect.InvocationTargetException: null 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:201304051638] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:201304051638] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:201304051638] 
    at java.lang.reflect.Method.invoke(Method.java:601) ~[na:1.7.0] 
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:65) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    ... 85 common frames omitted 
Caused by: java.lang.NullPointerException: null 
    at org.hibernate.engine.internal.StatefulPersistenceContext.getLoadedCollectionOwnerOrNull(StatefulPersistenceContext.java:859) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.event.spi.AbstractCollectionEvent.getLoadedOwnerOrNull(AbstractCollectionEvent.java:75) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.event.spi.InitializeCollectionEvent.<init>(InitializeCollectionEvent.java:36) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1846) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:549) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:234) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at org.hibernate.collection.internal.PersistentSet.iterator(PersistentSet.java:180) ~[hibernate-core-4.2.0.Final.jar:4.2.0.Final] 
    at com.mycompany.domain.Book.setTags(Book.java:185) ~[classes/:na] 
    ... 90 common frames omitted 
+0

Jak ty inicjalizacji zmiennej 'tags' użytkownika. Czy jest możliwe, że jest to 'null' i że NPE jest rzucane, gdy wywoływacz jest wywoływany? – stevevls

+0

Btw, adnotacja settera nie jest obsługiwana w Jpa/Hibernate, zamiast tego pobiera adnotację do gettera lub pola. –

Odpowiedz

15

Domyślam się, że Hibernate wywołuje twój seter z własną implementacją Set (PersistentSet), który implementuje leniwy załadunek, i nie jest jeszcze zainicjowany, gdy wywoływany jest setter. Ponieważ wywołuje się metodę na tym zestawie, sama ustawia ustawione obciążenie, gdy znajduje się już w fazie ładowania, co powoduje, że stan hibernacji jest niespójny.

Dlatego preferuję korzystanie z dostępu do pola przez dostęp do właściwości (tj. Umieszczanie wszystkich adnotacji mapowania na polach zamiast na pobierających). Chcesz wykonać kopię przekazanego zestawu, gdy metoda jest wywoływana przez "normalny" kod, ale nie chcesz tego robić, gdy Hibernate sam wywoła program ustawiający: całkowicie przerywa ładowanie.

+6

W skrócie: zmień kod ustawiający na 'this.tags = tags;' i powinno działać poprawnie. –

+0

Zrobiliśmy bardzo duży projekt ze strategią dostępu do sieci, musieliśmy stawić czoła wielu problemom (ale jest już za późno i będzie nas to wiele kosztowało, aby zmienić strategię), ponieważ nie ma sposobu na zastąpienie mapowania w tej strategii, ale przez nadpisywanie metod i ponowne przypisywanie można zmienić konfigurację odwzorowań. –

+0

@JBNizet Działa teraz, jednak czy to złe podejście, jak mówi Amir? – LuckyLuke

2

Z javadoc:

wystąpił problem dostępu właściwość instancją uporczywej klasy poprzez odbicie, albo przez CGLIB. Istnieje szereg możliwych przyczyn tego stanu rzeczy, w tym

- failure of a security check 
- an exception occurring inside the getter or setter method 
- a nullable database column was mapped to a primitive-type property 
- the Hibernate type was not castable to the property type (or vice-versa) 

Powiedziałbym, this.tags (pole) lub tags (parametr) jest null, ale aby zrozumieć to, można wydrukować cały stos -trace, wskaże główną przyczynę.

+0

Nie. Jest inicjowany w konstruktorze. – LuckyLuke

+0

Spróbuj wydrukować znaczniki w czasie ustawiania ... ponieważ jeśli obiekt zostanie zbudowany na podstawie deserializacji, konstruktor nie zostanie wykonany. –

+0

Co masz na myśli? – LuckyLuke

1

Najprostszym sposobem, aby to zrozumieć, jest zawinięcie elementów setTag w próbie catch i zarejestrowanie dowolnych wyjątków za pomocą wybranego systemu rejestrowania.

Moje pierwsze przypuszczenie jest takie, że zmienna instancji tagów ma wartość null. Byłbym bardzo zaskoczony, gdyby tak nie było, ale powinno być trywialne, aby zweryfikować przy użyciu debuggera w teście integracji Moje drugie przypuszczenie byłoby takie, że argument przekazany do setTags() nie został poprawnie zainicjowany, lub ma wartość null lub generuje wyjątek, gdy pętla for próbuje go powtórzyć.

3

Przekazujesz null jako argument metody, więc dla - każdy konstrukt zgłasza wyjątek.Użyj stan osłony i wszystko idzie ok:

@ManyToMany(fetch = FetchType.EAGER) 
public void setTags(Set<Tags> tags) { 
    this.tags.clear(); 

    if (tags != null) { 
     for (Tag tag : tags) { 
      addTag(tag); 
     } 
    } 
} 

ale wolę:

@ManyToMany(fetch = FetchType.EAGER) 
public void setTags(Set<Tags> tags) { 
    this.tags = tags; 
} 
+0

Niekoniecznie "ty". Tutaj Hibernate wywoływał moją metodę ustawiającą, przekazując argument "null", co spowodowało wyjątek. – Dinei

Powiązane problemy