以下是表格结构:
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 :(得分: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查询加载的,因此扩展它提供了一种解决方法