2012-10-09 24 views
2

我已經使用em.clear()分離了所有實體,但沒有看到關聯的對象分離?如何分離關聯的對象?如何分離JPA中的關聯對象

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 survey id = 131 線程異常「SpringOsgiExtenderThread -134「org.springframework.beans.factory.BeanCreationException:在URL [bundle://178.124:0/META-INF/spring/module- context.xml]中定義的名爲'testCloseRequest'的bean創建時出錯:調用init方法失敗;嵌套異常是javax.jdo.JDODetachedFieldAccessException:您剛剛嘗試訪問「客戶」字段,但在分離 對象時,此字段未分離。要麼不訪問此字段,要麼在分離對象時將其分離。 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 在org.springframework .begin.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:294) at org.springframework.beans.factory。 support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) 在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 在org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:609) 在org.springframework。 context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) 在org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access $ 1600(AbstractDelegatedExecutionApplicationContext.java:69) 在org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext $ 4.run(AbstractDelegatedExecutionApplicationContext.java:355) at org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85) 在org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320) 在org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor $ CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132) at java.lang.Thread.run(Thread.java:662) 原因是:javax.jdo.JDODetachedFieldAccessException:您剛剛嘗試訪問字段「customer」,但是當您分離對象時,此字段未分離。要麼不訪問此字段,要麼在拆卸對象時拆下它。 at 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.testCloseRequest(WorkServiceTest.java:181) at sun.reflect.NativeMethodAccessorImpl。invoke0(本機方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在java.lang.reflect.Method.invoke(方法的.java:597) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1581) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1522) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) ... 14更多

回答

2

所有字段當前已加載已分離。你的領域不是急於加載,你似乎沒有訪問它,所以它沒有加載,因此它不分離。您顯然可以訪問它,或者使其成爲EAGER,或使用DataNucleus獲取組擴展來加載它。你也可以看看日誌,看看分離過程

+0

在世界的哪個地方你可以找到有關這方面的文檔? –