实体类:
public class CustomerSurvey implements Serializable {
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE,
generator="CUSTOMER_SURVEY_SEQUENCE")
@Column(name = "SURVEYID", nullable = false)
private String surveyId;
@Column(name="ATTACHMENT")
@Lob
private byte[] attachment;
....
持久化类/逻辑:
public List<CustomerSurvey> getSurveysByCustomer(String custNo)
throws WorkServiceException {
EntityManager em = entityManagerFactory.createEntityManager();
Query query = em.createNamedQuery("customerSurvey.findByCustomer")
.setParameter("custNo", custNo);
logger.debug(query);
List<CustomerSurvey> surveys = query.getResultList();
em.clear();
em.close();
return surveys;
}
消费者类别/逻辑:
List<CustomerSurvey> reviewSurveys = workService.getSurveysByCustomer("testCNo2");
for(CustomerSurvey rsurvey: reviewSurveys) {
Object obj = rsurvey.getAttachment();
byte[] buffer = (byte[]) obj;
OutputStream out = new FileOutputStream("C:\\Temp\\TulipsOut.jpg");
out.write(buffer);
}
我得到的错误是:
原因:javax.jdo.JDODetachedFieldAccessException:您刚刚尝试访问字段“附件”,但在分离对象时该字段尚未分离。要么不访问该字段,要么在分离 obj 时分离它
等等。
在 com.ge.dsp.iwork.entity.CustomerSurvey.jdoGetattachment(CustomerSurvey.java)
在 com.ge.dsp.iwork.entity.CustomerSurvey.getAttachment(CustomerSurvey.java:89)
在 com.ge.dsp.iwork.test.WorkServiceTest.testSubmitSurveyResponse(WorkServiceTest.java:270)
在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
在 java.lang.reflect.Method.invoke(Method.java:597)
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1581)
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1522)
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
... 14 更多
Thanks,
主要问题是private byte[] attachment;
.
- 默认加载的是
@Log
属性将是FetchType.LAZY
.
- The
Persistence Context
之后就会清楚clear()
的过程EntityManager
。这意味着所有托管实体都将变为分离状态。更多信息是here http://www.objectdb.com/java/jpa/persistence/managed.
- When an
Entity
是分离状态,如果您访问获取值,您将遇到您提到的问题。
简短回答:
After em.clear()
流程,您的实体实例surveys
将会被分离。这就是为什么你无法检索该值attachment
因为attachment
是延迟加载(FetchType.LAZY
).
解决方案 : use FetchType.EAGER
。我认为,大多数人不建议使用急切加载。
@Column(name="ATTACHMENT")
@Basic(fetch = FetchType.EAGER)
@Lov
private byte[] attachment;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)