2013-05-26 3 views
2

Я следовал http://justonjava.blogspot.in/2010/09/lazy-one-to-one-and-one-to-many.html, чтобы сделать отношение OneToOne ленивым.Hibernate OneToOne Lazy loading using FieldInterceptor issue

Он хорошо работает в большинстве случаев. Но в очень редких случаях (что является случайным) это не удается с следующей трассировке исключения:

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) 

Любая идея, как я могу решить эту проблему?

+0

Из-за ошибки похоже, что сеанс спящего режима закрывается преждевременно. Один из способов это может произойти, если вы загружаете объект в один поток (используя живой сеанс) и передаете его в другой поток, где объект обрабатывается асинхронно, но сеанс, связанный с объектом, был закрыт в 1-м потоке , –

+0

Каждая вещь происходит внутри одной транзакции. – Ambrish

ответ

1

Из вашего исключения

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

И AbstractEntityPersister's code (строка 741):

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); 
    } 
    ... 

Вы пытаетесь получить сущность которого поля идентификатора поля является неправдоподобным, как null (вероятно, не найдено).

Проверьте свой код. Вы выбираете действительный объект (возможно, его идентификатор null?) В Place.getPlaceShape(Place.java:153)?

И если вы не можете найти что-нибудь, может быть, проблема в том, вы используете null или недопустимые параметры в этих return (Person) fieldHandler.readObject(this, "owner", owner); и this.owner = fieldHandler.writeObject(this, "owner", this.owner, owner); строк кода данного пособия.

Обходной путь, который предлагает учебник, очень низкий, поэтому вы действительно должны быть уверены, что знаете, что делаете там.

Смежные вопросы