我已經使用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更多
在世界的哪個地方你可以找到有關這方面的文檔? –