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:フィールド "attachment"にアクセスしようとしましたが、オブジェクトをデタッチしたときにこのフィールドがデタッチされませんでした。このフィールドにアクセスしないか、オブジェクトをデタッチするときにデタッチしてください。com.ge.dsp.iwork.entity.CustomerSurvey.jdoGetattachment(CustomerSurvey.java)at com.ge.dsp.iwork.entity.CustomerSurvey.getAttachment(CustomerSurvey.java:89)at com.ge.dsp.iwork.test .WorkServiceTest.testSubmitSurveyResponse(WorkServiceTest.java:270)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Delegating :25)orgの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のため、値を取得できません。attachmentFetchType.LAZY

解決策:を使用しますFetchType.EAGER。ほとんどの人は、積極的な読み込みの使用を推奨していないと思います。

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