我跟着http://justonjava.blogspot.in/2010/09/lazy-one-to-one-and-one-to-many.html使OneToOne关系变得懒惰。
在大多数情况下都运作良好。但是在极少数情况下(这是随机的)它会失败并跟随异常跟踪:
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)
从您的例外
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);
}
...
您正在尝试获取 ID字段字段被提取为null
的实体(可能未找到)。
检查您的代码。您是否在null
处获取了有效对象(可能其ID为Place.getPlaceShape(Place.java:153)
?)?
如果您没有找到任何内容,可能问题是您在教程代码的null
和return (Person) fieldHandler.readObject(this, "owner", owner);
行中使用this.owner = fieldHandler.writeObject(this, "owner", this.owner, owner);
或无效参数。
教程建议的解决方法是非常低级的,所以你必须确保你知道你在那里做了什么。