2012-10-12 59 views
1

以下是表结构:JPA @OneToMany不取的子女

desc customer_survey 
Name  Null  Type   
----------- -------- ------------ 
SURVEYID NOT NULL VARCHAR2(10) 
CUSTNO  NOT NULL VARCHAR2(10) 
SRNO     NUMBER(10) 
AVGRATINGS   NUMBER(5,2) 
COMMENTS    VARCHAR2(50) 
SENTON    DATE   
RESPONDEDON   DATE   

desc Survey_response 
Name    Null  Type   
---------------- -------- ------------ 
SURVEYRESPONSEID NOT NULL NUMBER(10) 
RATINGS   NOT NULL NUMBER(2)  
QNO    NOT NULL VARCHAR2(10) 
SURVEYID   NOT NULL VARCHAR2(10) 

Java类:

public class CustomerSurvey implements Serializable { 

@OneToMany(fetch=FetchType.EAGER, mappedBy="customerSurvey", 
    cascade=CascadeType.ALL) 
private Set<SurveyResponse> responses; 
...... 

public class SurveyResponse { 

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="SURVEYID", referencedColumnName="surveyId") 
private CustomerSurvey customerSurvey; 

...... 

客户端代码:

List<CustomerSurvey> surveys = workService.getSurveysByCustomer("testCNo2"); 
System.out.println("surveys size = " + surveys.size()); 

for(CustomerSurvey survey: surveys) { 
System.out.println("getting responses from the survey object now.."); 
Set<SurveyResponse> responses = survey.getResponses(); 
System.out.println("responses size= .." + responses.size()); 
} 

控制台显示:

调查大小= 1 现在从调查对象获取响应.. 响应大小= ..0

而在所选调查的数据库中有7个响应。

回答

0

this link帮助。 我将集合重新设置为懒惰。而
内的持久性类,事务中得到结果集后,我现在打电话getResponses为:

List<CustomerSurvey> surveys = query.getResultList(); 
for (CustomerSurvey survey : surveys) { 
    Set<SurveyResponse> responses = survey.getResponses(); 
} 

用于填充响应。

2

启用记录并查看SQL是否正确。

很难从不完整的代码中知道,但通常OneToMany不应该使用JoinColumn它应该使用mappedBy,并且ManyToOne中的连接列应引用该对象的Id。

还要确保在插入对象时设置关系的两侧。

+0

我根据您的评论更改了我的代码。查询日志文件显示:SELECT'com.ge.dsp.iwork.entity.CustomerSurvey'AS NUCLEUS_TYPE,SURVEY.AVGRATINGS,SURVEY.COMMENTS,B0.CITY,B0.COMPANYNAME,B0.CUSTNO,B0.EMAIL,B0.FIRSTNAME ,B0.GENDER,B0.LASTNAME,B0.MIDINIT,B0.PHONE,B0。 “国家”,B0.STREETADDRESS,B0.TITLE,B0.ZIPCODE,SURVEY.RESPONDEDON,SURVEY.SENTON,C0.CUSTNO,C0.DATECREATED ,C0.DATEUPDATED,C0.DESCRIPTION,C0.SRNO,C0.STATUS,SURVEY.SURVEYID FROM CUSTOMER_SURVEY SURVEY INNER JOIN CINOMER B0 ON SURVEY.CUSTNO = B0.CUSTNO LEFT OUTER JOIN SERVICE_REQUEST C0 ON SURVEY.SRNO = C0.SRNO WHERE B0 .CUSTNO = <'testCNo2'> – beetri

0

另一种选择是填充了JPQL的关系获取查询:

“从调查中选择调查调查一起取survey.responses”

我有同样的问题,但还是无法找出什么出错了。在我的情况下,父实体通过jpql查询加载,因此扩展此提供了一种解决方法

+0

它可以帮助我。可能页面https://en.wikibooks.org/wiki/Java_Persistence/Querying可以在将来帮助某人 – Yauhen

+0

我遇到了有关此解决方案的另一个问题,在我之前的评论中提到:重复数据和巨大联接 联接的一个问题获取是可以返回重复的数据。例如,考虑联接获取员工的phoneNumbers关系。如果每个员工在其phoneNumbers集合中都有3个电话对象,则加入需要带回n * 3行。由于每个员工行有3个电话行,所以员工行将被复制3次。 联合提取的另一种解决方案是不使用重复数据,它使用批处理提取。 – Yauhen