4

实体类:

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:您刚刚尝试访问字段“附件”,但在您分离对象时该字段未分离。要么不要访问此字段,要么在分离对象时将其分离。在 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(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java :25) 在组织的 java.lang.reflect.Method.invoke(Method.java:597)。

谢谢,

4

1 回答 1

7

主要问题是private byte[] attachment;

  1. 属性的默认加载@Log将是FetchType.LAZY.
  2. 的过程Persistence Context之后会很清楚。这意味着所有托管实体都将变为分离状态。更多信息在这里clear()EntityManager
  3. 当一个Entity处于分离状态时,如果您访问获取值,您将遇到您提到的问题。

简短的回答:

处理后em.clear(),您的实体实例surveys将被分离。attachment这就是为什么由于attachment延迟加载(FetchType.LAZY)而无法检索该值的原因。

解决方法:使用FetchType.EAGER。我认为,大多数人不建议使用急切加载。

    @Column(name="ATTACHMENT")
    @Basic(fetch = FetchType.EAGER)
    @Lov
    private byte[] attachment;
于 2012-10-23T21:36:52.880 回答