What cause org.hibernate.PropertyAccessException: Exception occurred inside setter
Solution 1
My guess is that Hibernate calls your setter with its own implementation of Set (PersistentSet) which implements lazy-loading, and is not initialized yet when the setter is called. Since you call a method on this set, it makes the set load itself while already being in a loading phase, which puts Hibernate in an inconsistent state.
That's why I prefer using field access over property access (i.e. put all the mapping annotations on fields rather than getters). You want to make a copy of the passed set when the method is called by "normal" code, but you don't want to do that when Hibernate itself calls the setter: it completely break lazy-loading.
Solution 2
From javadoc:
A problem occurred accessing a property of an instance of a persistent class by reflection, or via CGLIB. There are a number of possible underlying causes, including
- 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)
I would say, this.tags
(field) or tags
(parameter) is null
, but in order to figure it out, you can print the entire stack-trace, tis would point the root cause.
Solution 3
You are passing null
as argument of method, so for-each construct throws an exception. Use a guard condition and everything goes ok:
@ManyToMany(fetch = FetchType.EAGER)
public void setTags(Set<Tags> tags) {
this.tags.clear();
if (tags != null) {
for (Tag tag : tags) {
addTag(tag);
}
}
}
but I prefer:
@ManyToMany(fetch = FetchType.EAGER)
public void setTags(Set<Tags> tags) {
this.tags = tags;
}
Solution 4
The easiest way to figure this out is to wrap the internals of setTags in a try catch, and log any exceptions using your logging system of choice.
My first guess is that the tags instance variable is null. I would be very surprised if this wasn't the case, but it should be trivial to verify using a debugger in an integration test
My second guess would be that the argument passed to setTags() is not being initialized correctly, or is null, or is throwing some kind of exception when your for loop attempts to iterate on it.
LuckyLuke
Updated on July 09, 2022Comments
-
LuckyLuke almost 2 years
What cause this exception, I can't manage to find out.
Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Exception occurred inside setter of my.Class
Root cause:
javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Exception occurred inside setter of my.Class
Code:
@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 tags in the constructor:
tags = new HashSet<Tag>();
EDIT
Exception from logging in setter method:
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
-
LuckyLuke about 11 yearsNope. It is initialized in the constructor.
-
Francisco Spaeth about 11 yearsTry to print tags at the setter time... because if your object is built based on deserialization, the constructor is not executed.
-
Paul Sanwald about 11 yearsThe correct way to figure this out is to wrap the internals of setTags in a try catch, and log any exceptions using your logging system of choice.
-
Francisco Spaeth about 11 yearsjust to optimize it, you are using a
Set
, you don't need to check if the tag is already in the set, because a feature fromSet
is to have unique instances in it. -
LuckyLuke about 11 yearsSee exception, do you understand?
-
JB Nizet about 11 yearsIn short : change your setter code to
this.tags = tags;
, and it should work fine. -
Amir Pashazadeh about 11 yearsWe've done a very large project with field access strategy, we faced lots of troubles (but it is too late and it will costs us to much to change the strategy), because there is no way to override mappings in this strategy, but by overriding methods and re-annotating you can reconfigure mappings.
-
LuckyLuke about 11 years@JBNizet It works now, however is this a bad approach like Amir says?
-
JB Nizet about 11 years@Amir: then you simply missed the AttributeOverride(s) and AssociationOverride(s) annotations. No, using field access is not a bad approach at all.
-
Anton over 9 years+1 Helped a lot. It's not straightforward and exception gives no clue.
-
Dinei almost 7 yearsNot necessarily "you". Here Hibernate was calling my setter method passing a
null
argument and this threw the exception.