2

em.clear()を使用してすべてのエンティティをデタッチしましたが、関連付けられたオブジェクトがデタッチされていませんか?関連するオブジェクトを切り離す方法は?

 I have a method as : 

 public CustomerSurvey getSurveyByRequest(long requestNo)
        throws WorkServiceException {
    logger.debug("Inside getSurveyByRequest : " + requestNo);
    EntityManager em = entityManagerFactory.createEntityManager();
    Query query = em.createNamedQuery("customerSurvey.findByRequest")
            .setParameter("srNo", requestNo);
    List<CustomerSurvey> surveys = query.getResultList();
    **em.clear();**
    em.close();
    return surveys.get(0);
}

CustomerSurvey.java:

@Entity
@Table(name = "CUSTOMER_SURVEY", uniqueConstraints = { @UniqueConstraint(columnNames 
= "SERVEYID") })
@SequenceGenerator(name="CUSTOMER_SURVEY_SEQUENCE", 
sequenceName="CUSTOMER_SURVEY_SEQUENCE", initialValue=1, allocationSize=100)

@NamedQueries({
@NamedQuery(name="customerSurvey.findByRequest",
        query="SELECT survey FROM CustomerSurvey survey " +
                "WHERE survey.serviceRequest.srNo = :srNo")
})

public class CustomerSurvey implements Serializable {

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, 
generator="CUSTOMER_SURVEY_SEQUENCE")
@Column(name = "SURVEYID", nullable = false)
private String surveyId;

     @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.DETACH)
@JoinColumn(name="CUSTNO", referencedColumnName="CustNO")
private Customer customer;

@Column(name="AVGRATINGS")
private int avgRatings;

@Column(name="COMMENTS")
private String comments;

@Column(name="SENTON")
private Date sentOn;

@Column(name="RESPONDEDON")
private Date respondedOn;

@OneToMany(fetch=FetchType.LAZY,mappedBy="customerSurvey")
private Set<SurveyResponse> responses;

@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name="SRNO")
private ServiceRequest serviceRequest;

私のテストクラス:

CustomerSurvey survey = workService.getSurveyByRequest(request.getSrNo());
        System.out.println("survey = " + survey);
        System.out.println("survey id = " + survey.getSurveyId());
        System.out.println("survey customer = " + survey.getCustomer());

エラーメッセージ:

調査=com.ge.dsp.iwork.entity.CustomerSurvey@36b88ea5調査ID=131スレッド"SpringOsgiExtenderThread-134"の例外org.springframework.beans.factory.BeanCreationException:URL[バンドルで定義された名前'testCloseRequest'のBeanの作成中にエラーが発生しました://178.124:0 / META-INF / spring / module-context.xml]:initメソッドの呼び出しに失敗しました。ネストされた例外はjavax.jdo.JDODetachedFieldAccessExceptionです。フィールド「customer」にアクセスしようとしましたが、オブジェクトをデタッチしたときにこのフィールドはデタッチされませんでした。このフィールドにアクセスしないか、オブジェクトをデタッチするときにデタッチしてください。 AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320)at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor $ CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132)at java.lang.Thread.run( 662)原因:javax.jdo.JDODetachedFieldAccessException:フィールド "customer"にアクセスしようとしましたが、オブジェクトをデタッチしたときにこのフィールドがデタッチされませんでした。このフィールドにアクセスしないか、オブジェクトをデタッチするときにデタッチしてください。com.ge.dsp.iwork.entity.CustomerSurvey.jdoGetcustomer(CustomerSurvey.java)at com.ge.dsp.iwork.entity.CustomerSurvey.getCustomer(CustomerSurvey.java:89)at com.ge.dsp.iwork.test .WorkServiceTest。

4

1 に答える 1

2

現在ロードされているすべてのフィールドが切り離されます。フィールドは熱心にロードされておらず、アクセスしていないように見えるため、ロードされていないため、切り離されていません。明らかにアクセスするか、EAGERにするか、DataNucleusフェッチグループ拡張機能を使用してロードすることができます。ログを見るだけで、デタッチプロセスを確認することもできます

于 2012-10-10T07:16:22.320 に答える