JPA @OneToMany没有抓住孩子

时间:2012-10-12 19:57:57

标签: jpa one-to-many eager-loading many-to-one

以下是表格结构:

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个回复。

3 个答案:

答案 0 :(得分:2)

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

很难从你的不完整代码中判断出来,但一般来说OneToMany不应该使用JoinColumn它应该使用mappedBy,而ManyToOne中的join列应该引用对象的Id。

同时确保在插入对象时设置关系的两面。

答案 1 :(得分:0)

this link帮了忙。 我把这个系列设置回懒惰。和
在持久化类内部,在获取结果集之后的事务中,我现在将getResponses称为:

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

填充回复。

答案 2 :(得分:0)

另一种选择是使用jpql fetch查询填充关系:

“从调查调查中选择调查加入获取调查。回复”

我遇到了同样的问题,仍然无法找出问题所在。在我的情况下,父实体是由jpql查询加载的,因此扩展它提供了一种解决方法