2015-01-04 69 views
4
的反射吸氣字段值

我有以下實體:javax.persistence.PersistenceException:org.hibernate.PropertyAccessException:無法獲得通過Entity.id

@Entity 
public class Employee implements Serializable{ 
    private static final long serialVersionUID = 3454567L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int empId; 

    @Column 
    private String username; 

    public int getEmpId() { 
     return empId; 
    } 

    public void setEmpId(int empId) { 
     this.empId = empId; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 
} 

而下面的EJB:

public class UserDAO implements UserDAOInterface{ 

    @PersistenceContext(unitName = "MainPersistenceUnit") 
    private EntityManager em; 

    @Override 
    public void persist(Employee sdf) { 
     try { 
      em.persist(sdf); 
     } catch (Exception e) { 
      Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", e); 
      throw new RuntimeException(e); 
     } 
    } 
} 

當一直存在被調用時,用下面的根本原因則拋出異常:

Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.mine.projs.library.entity.Employee.empId 
    at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:60) 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:346) 
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4746) 
    at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4465) 
    at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:243) 
    at org.hibernate.event.internal.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:511) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:116) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:784) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1181) 
    ... 100 more 

以下是來自GlassFish 4.1的完整日誌:

Info: HHH000204: Processing PersistenceUnitInfo [ 
    name: MainPersistenceUnit 
    ...] 
Info: HHH000412: Hibernate Core {4.3.7.Final} 
Info: HHH000206: hibernate.properties not found 
Info: HHH000021: Bytecode provider name : javassist 
Info: HCANN000001: Hibernate Commons Annotations {4.0.5.Final} 
Info: HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect 
Info: HHH000397: Using ASTQueryTranslatorFactory 
Info: HHH000227: Running hbm2ddl schema export 
Info: Hibernate: drop table if exists Employee 
Info: Hibernate: create table Employee (empId integer not null auto_increment, username varchar(255), primary key (empId)) ENGINE=InnoDB 
Info: HHH000230: Schema export complete 
Info: Portable JNDI names for EJB UserService: [java:global/Library/UserService, java:global/Library/UserService!com.mine.projs.library.service.interfaces.UserServiceInterface] 
WARN: WELD-000411: Observer method [BackedAnnotatedMethod] private org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds. 
WARN: WELD-000411: Observer method [BackedAnnotatedMethod] public org.glassfish.jms.injection.JMSCDIExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds. 
WARN: WELD-000411: Observer method [BackedAnnotatedMethod] org.glassfish.sse.impl.ServerSentEventCdiExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>, BeanManager) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds. 
Info: Initializing Mojarra 2.2.7 (20140610-1547 https://svn.java.net/svn/mojarra~svn/tags/[email protected]) for context '/libr' 
Info: Running on PrimeFaces 5.1 
Info: Loading application [Library] at [/libr] 
Info: Library was successfully deployed in 3,429 milliseconds. 
Info: inside getAna 
Info: inside Create User 
Severe: exception caught 
javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.mine.projs.library.entity.Employee.empId 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1187) 
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.persist(EntityManagerWrapper.java:287) 
    at com.mine.projs.library.dao.UserDAO.persist(UserDAO.java:20) 
    at com.mine.projs.library.service.UserService.createUSer(UserService.java:21) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153) 
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4786) 
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:656) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608) 
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46) 
    at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52) 
    at sun.reflect.GeneratedMethodAccessor103.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140) 
    at sun.reflect.GeneratedMethodAccessor151.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369) 
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758) 
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) 
    at com.sun.proxy.$Proxy321.createUSer(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.jboss.weld.util.reflection.Reflections.invokeAndUnwrap(Reflections.java:414) 
    at org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.java:127) 
    at org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:56) 
    at org.jboss.weld.bean.proxy.InjectionPointPropagatingEnterpriseTargetBeanInstance.invoke(InjectionPointPropagatingEnterpriseTargetBeanInstance.java:65) 
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100) 
    at com.mine.projs.library.service.UserServiceInterface$243194531$Proxy$_$$_Weld$EnterpriseProxy$.createUSer(Unknown Source) 
    at com.mine.projs.library.view.UserBean.getAna(UserBean.java:29) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:363) 
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) 
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) 
    at com.sun.el.parser.AstValue.getValue(AstValue.java:140) 
    at com.sun.el.parser.AstValue.getValue(AstValue.java:204) 
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226) 
    at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50) 
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) 
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) 
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) 
    at javax.faces.component.UICommand.getValue(UICommand.java:218) 
    at com.sun.faces.renderkit.html_basic.ButtonRenderer.encodeBegin(ButtonRenderer.java:119) 
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:864) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1854) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:456) 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133) 
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201) 
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175) 
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561) 
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.mine.projs.library.entity.Employee.empId 
    at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:60) 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:346) 
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4746) 
    at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4465) 
    at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:243) 
    at org.hibernate.event.internal.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:511) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:116) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:784) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1181) 
    ... 100 more 

這是如何引起的,我該如何解決它?

+0

在附註中,Employee類沒有Table註釋,但不應該是根本原因。是否還有其他包含Employee類映射的jpa實體? –

+0

提供的StackTrace中的這行代碼:'org.hibernate。PropertyAccessException:無法通過反射獲取字段值getter'基本上意味着實體之間關聯之間的一些映射問題。因此,根本原因基本上只是Hibernate/JPA,因此這些問題標籤的其餘部分只是假標籤。而且,根據問題的現狀,這些協會是不可見的。你最好將問題領域分開,去除整個JSF噪聲,以吸引Hibernate/JPA專家,並儘快獲得更好的幫助。 – Tiny

+0

您可以嘗試將GenerationType.AUTO更改爲GenerationType.IDENTITY –

回答

4

我有同樣的問題。這個錯誤似乎已經開始使用HB 4.3.6並且已經存活了,我正在嘗試4.3.10;具有相同的結果。

在我看來,實體字段被訪問的方式在HB 4.3.6+中更改,可能與類加載器有關。在HB 4.3.6之前,將DB驅動程序jar文件嵌入到ear文件中可以正常工作(部署非常簡單,乾淨)。在4.3.6之後,它不起作用(類沒有發現異常),現在驅動程序jar文件必須放在Glassfish的lib文件夾中。

胡安

+2

剛剛找到解決方案。看看https://hibernate.atlassian.net/browse/HHH-9446。在hibernate.properties文件或persistence.xml文件中添加hibernate.classloading.use_current_tccl_as_parent = false。 – jfarjona

+0

@ jfarjona OMG你是男人!我花了10個小時尋找解決方案。你能解釋它的作用嗎? – Greyshack

-3

你的類應該是映射到使用註釋表列中的字段,如

@Entity 
@Table(name="employee") 
public class Employee implements Serializable{ 
    private static final long serialVersionUID = 3454567L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @cloumn(name="emp_id") 
    private int empId; 

    @Column(name="user_name") 
    private String username; 

    public int getEmpId() { 
     return empId; 
    } 

    public void setEmpId(int empId) { 
     this.empId = empId; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 
} 
+0

我嘗試過沒有運氣。該表在數據庫中創建時沒有問題。持續時發生異常。 – Abdulrahman

0

這可能是與Hibernate的一個問題。

當試圖通過Hibernate 4.3.6.FINAL嘗試持久化一個新的「Product」實體(請參閱測試用例)時,會引發以下異常。不過,如果我將Maven依賴關係更改爲4.3.5.FINAL而不觸及任何其他代碼段,那麼它工作得很好。

Hibernate issue tracker

所以我建議改變Hibernate的版本4.3.5。我有同樣的問題,並修復它。

1

那來自一個類加載器的問題,當Hibernate在部署加載初始級,將創建一個虛擬的類加載器來構建目錄。在運行時,目錄中的類不具有相同的類加載器,並且sun.reflect.UnsafeFieldAccessorImpl.ensureObj方法失敗。 57

我通過創建自定義解決的GlassFish 4.1和休眠-的EntityManager-4.3.11.Final.jar問題:

protected void ensureObj(Object obj) 
{ 
    if(!field.getDeclaringClass().isAssignableFrom(obj.getClass())) 
    { 
     throwSetIllegalArgumentException(obj); 
    } 
} 

這種方法是從DirectPropertyAccessor $ DirectGetter.get(對象)行調用jpa提供者,其附加正確的類加載器。

package org.hibernate.jpa; 

import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 
import java.lang.reflect.Proxy; 
import java.util.Map; 

import javax.persistence.EntityManagerFactory; 
import javax.persistence.spi.PersistenceUnitInfo; 

import org.hibernate.jpa.HibernatePersistenceProvider; 

/** 
* Lazy HibernatePersistenceProvider whose take Thread class loader as source 
* and not the dummy one 
* 
* @author Alexandre Heroux 
* 
*/ 
public class LazyHibernatePersistenceProvider extends HibernatePersistenceProvider { 
    @SuppressWarnings("rawtypes") 
    @Override 
    public EntityManagerFactory createContainerEntityManagerFactory(final PersistenceUnitInfo info, 
      final Map properties) { 
     return (EntityManagerFactory) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), 
       new Class[] { EntityManagerFactory.class }, new InvocationHandler() { 
        private EntityManagerFactory entityManagerFactory = null; 

        @Override 
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
         return method.invoke(getEntityManagerFactory(info, properties), args); 
        } 

        /** 
        * Create the EntityManagerFactory when is not exists 
        * 
        * @param info 
        * @param properties 
        * @return 
        */ 
        protected EntityManagerFactory getEntityManagerFactory(PersistenceUnitInfo info, Map properties) { 
         if (entityManagerFactory == null) { 
          synchronized (this) { 
           if (entityManagerFactory == null) { 
            entityManagerFactory = LazyHibernatePersistenceProvider.this 
              .createParentContainerEntityManagerFactory(info, properties); 
           } 
          } 
         } 
         return entityManagerFactory; 
        } 
       }); 
    } 

    /** 
    * Call parent method 
    * 
    * @param info 
    * @param properties 
    * @return 
    */ 
    protected EntityManagerFactory createParentContainerEntityManagerFactory(PersistenceUnitInfo info, Map properties) { 
     return super.createContainerEntityManagerFactory(info, properties); 
    } 
}