JPA@OneToMany不接孩子
以下是表格结构:JPA@OneToMany不接孩子,jpa,one-to-many,eager-loading,many-to-one,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
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;
......
公共类CustomerSurvey实现可序列化{
@OneToMany(fetch=FetchType.EAGER,mappedBy=“customerSurvey”,
级联=级联类型(全部)
私有集响应;
......
公共类调查响应{
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“SURVEYID”,referencedColumnName=“SURVEYID”)
私人客户调查客户调查;
......
客户端代码:
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());
}
List surveys=workService.getSurveysByCustomer(“testCNo2”);
System.out.println(“surveys size=“+surveys.size());
用于(客户调查:调查){
System.out.println(“立即从调查对象获取响应…”);
设置响应=survey.getResponses();
System.out.println(“响应大小=…”+响应大小();
}
控制台显示:
调查规模=1
正在从测量对象获取响应。。
响应大小=…0
而对于所选调查,数据库中有7个响应。启用日志记录并查看SQL是否正确 很难从不完整的代码中分辨出来,但一般来说,OneToMany不应该使用JoinColumn,它应该使用mappedBy,而ManyTone中的join列应该引用对象的Id 另外,请确保在插入对象时设置了关系的两侧。帮助。 我将集合设置为lazy。并且
在持久性类中,在获取resultset后的事务中,我现在调用getResponses作为:
List<CustomerSurvey> surveys = query.getResultList();
for (CustomerSurvey survey : surveys) {
Set<SurveyResponse> responses = survey.getResponses();
}
List surveys=query.getResultList();
用于(客户调查:调查){
设置响应=survey.getResponses();
}
另一个选项是使用jpql fetch查询填充关系: “从调查中选择调查调查加入获取调查。响应”
我也遇到了同样的问题,但仍然无法找出问题所在。在我的例子中,父实体是由jpql查询加载的,因此扩展它提供了一个解决方法我根据您的评论更改了代码。日志文件中的查询显示:选择'com.ge.dsp.iwork.entity.CustomerSurvey'作为NUCLEUS\u类型,SURVEY.AVGRATINGS,SURVEY.COMMENTS,B0.CITY,B0。公司名称,B0.CUSTNO,B0.EMAIL,B0.FIRSTNAME,B0.GENDER,B0.LASTNAME,B0.MIDINIT,B0.PHONE,B0.“状态”,B0.STREETADDRESS,B0.TITLE,B0.ZIPCODE,SURVEY.respondeon,SURVEY.SENTON,C0.CUSTNO,C0.DATECREATED,C0.DATEUPDATED,C0.DESCRIPTION,C0.SRNO,C0.STATUS,SURVEY.SURVEYID FROM CUSTOMER\u SURVEY SURVEY内部加入客户B0 ON SURVEY.CUSTNO=B0.CUSTNO左外部加入服务\u SURVEY请求C0 ON SURVEY.SRNO=C0.SRNO=C0.SRNO,其中B0.CUSTNO=C0.SRNO=这对我有帮助。可能是页面在未来的评论中,我可以帮助我解决这个问题的另一个问题:重复数据和连接的一个大问题是重复数据可以被返回。例如,考虑连接获取一个员工的音素关系。如果每个雇员在其音素中有3个电话对象。llection,加入将需要返回n*3行。由于每个员工行有3个电话行,员工行将被复制3次。一种不存在重复数据的加入提取替代解决方案是使用批提取。