Java 使用FieldInterceptor问题休眠OneTONE延迟加载

Java 使用FieldInterceptor问题休眠OneTONE延迟加载,java,hibernate,lazy-loading,one-to-one,Java,Hibernate,Lazy Loading,One To One,我一直在追求让一个人的关系变得懒惰 它在大多数情况下运行良好。但在极少数情况下(这是随机的),它会出现以下异常跟踪: com.myapp.shape.ui.exception.DataIngestionException at com.myapp.shape.ui.data.DataIngestionJob.importMif(DataIngestionJob.java:242) at com.myapp.shape.ui.service.impl.DataIng

我一直在追求让一个人的关系变得懒惰

它在大多数情况下运行良好。但在极少数情况下(这是随机的),它会出现以下异常跟踪:

com.myapp.shape.ui.exception.DataIngestionException
        at com.myapp.shape.ui.data.DataIngestionJob.importMif(DataIngestionJob.java:242)
        at com.myapp.shape.ui.service.impl.DataIngestionServiceImpl$DataImportProcess.processJob(DataIngestionServiceImpl.java:488)
        at com.myapp.shape.ui.service.impl.DataIngestionServiceImpl$DataImportProcess.run(DataIngestionServiceImpl.java:462)
        at java.lang.Thread.run(Thread.java:722)
Exception in thread "Thread-7" javax.persistence.RollbackException: Error while committing the transaction
        at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:93)
        at com.myapp.shape.ui.service.impl.DataIngestionServiceImpl.readJob(DataIngestionServiceImpl.java:539)
        at com.myapp.shape.ui.service.impl.DataIngestionServiceImpl$DataImportProcess.processJob(DataIngestionServiceImpl.java:511)
        at com.myapp.shape.ui.service.impl.DataIngestionServiceImpl$DataImportProcess.run(DataIngestionServiceImpl.java:462)
        at java.lang.Thread.run(Thread.java:722)
Caused by: javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Exception occurred inside getter of com.myapp.shape.data.dao.Place.placeShape
        at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
        at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
        at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:81)
        ... 4 more
Caused by: org.hibernate.PropertyAccessException: Exception occurred inside getter of com.myapp.shape.data.dao.Place.placeShape
        at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:175)
        at org.hibernate.envers.entities.mapper.MultiPropertyMapper.mapToMapFromEntity(MultiPropertyMapper.java:107)
        at org.hibernate.envers.synchronization.work.CollectionChangeWorkUnit.generateData(CollectionChangeWorkUnit.java:56)
        at org.hibernate.envers.synchronization.work.AbstractAuditWorkUnit.perform(AbstractAuditWorkUnit.java:72)
        at org.hibernate.envers.synchronization.AuditProcess.executeInSession(AuditProcess.java:114)
        at org.hibernate.envers.synchronization.AuditProcess.doBeforeTransactionCompletion(AuditProcess.java:152)
        at org.hibernate.engine.ActionQueue$BeforeTransactionCompletionProcessQueue.beforeTransactionCompletion(ActionQueue.java:543)
        at org.hibernate.engine.ActionQueue.beforeTransactionCompletion(ActionQueue.java:216)
        at org.hibernate.impl.SessionImpl.beforeTransactionCompletion(SessionImpl.java:571)
        at org.hibernate.jdbc.JDBCContext.beforeTransactionCompletion(JDBCContext.java:250)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:138)
        at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76)
        ... 4 more
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.GeneratedMethodAccessor285.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at **org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:172)
        ... 15 more
Caused by: org.hibernate.HibernateException: entity is not associated with the session: null
        at org.hibernate.persister.entity.AbstractEntityPersister.initializeLazyProperty(AbstractEntityPersister.java:806)
        at org.hibernate.intercept.AbstractFieldInterceptor.intercept(AbstractFieldInterceptor.java:97)
        at org.hibernate.intercept.javassist.FieldInterceptorImpl.readObject(FieldInterceptorImpl.java:105)
        at com.myapp.shape.data.dao.Place.getPlaceShape(Place.java:153)
知道如何解决此问题吗?

来自您的异常

Caused by: org.hibernate.HibernateException:
                                entity is not associated with the session: null
        at org.hibernate.persister.entity.AbstractEntityPersister.initializeLazyProperty(AbstractEntityPersister.java:806)
和(第741行):

您正在尝试获取一个实体,该实体的ID字段字段被获取为
null
(可能未找到)

检查你的代码。您是否正在at
Place.getPlaceShape(Place.java:153)
中获取有效对象(可能其id为
null
?)

如果您没有找到任何内容,可能问题在于您正在使用
null
或那些
return(Person)fieldHandler.readObject中的无效参数(这个“owner”,owner)
this.owner=fieldHandler.writeObject(this,“owner”,this.owner,owner)教程代码行


本教程建议的解决方法级别很低,因此您必须确实知道自己在那里做什么。

从错误中可以看出,hibernate会话过早关闭。发生这种情况的一种方式是,如果在一个线程中加载对象(使用实时会话),并将其传递给另一个线程,在该线程中异步操作对象,但与该对象关联的会话在第一个线程中关闭。每件事都发生在单个事务中。
public Object initializeLazyProperty(String fieldName, Object entity,
                          SessionImplementor session) throws HibernateException {

   final Serializable id = session.getContextEntityIdentifier( entity );

   final EntityEntry entry = session.getPersistenceContext().getEntry( entity );

   if ( entry == null ) {
      throw new
          HibernateException("entity is not associated with the session: " + id);
   }
   ...