Oracle 一对多检索失败,Hibernate 5.1。1.Final
Oracle One-to-Many Retrieve Failing, Hibernate 5.1.1.Final
我有一个包含一对多关系的 class。检索工作正常,然后有人访问了数据库,现在检索无法填充集合。
关系:
父实体:许可期限
@OneToMany(fetch=FetchType.LAZY, mappedBy = "permitPeriodEntity")
@Cascade({CascadeType.ALL})
private Set<SubmittedFormEntity> submittedForms;
子实体:已提交表单
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns( {
@JoinColumn(name = "PERMIT_ID", insertable = false, updatable = false),
@JoinColumn(name = "PERIOD_ID", insertable = false, updatable = false)
})
private PermitPeriodEntity permitPeriodEntity;
当我将对象传递给 Dozer(延迟加载)时实际生成 SQL
Hibernate: select submittedf0_.PERMIT_ID as PERMIT_ID9_21_0_, submittedf0_.PERIOD_ID as PERIOD_ID8_21_0_, submittedf0_.FORM_ID as FORM_ID1_21_0_, submittedf0_.FORM_ID as FORM_ID1_21_1_, submittedf0_.CREATED_BY as CREATED_BY2_21_1_, submittedf0_.CREATED_DT as CREATED_DT3_21_1_, submittedf0_.FORM_NUM as FORM_NUM4_21_1_, submittedf0_.FORM_TYPE_CD as FORM_TYPE_CD5_21_1_, submittedf0_.MODIFIED_BY as MODIFIED_BY6_21_1_, submittedf0_.MODIFIED_DT as MODIFIED_DT7_21_1_, submittedf0_.PERIOD_ID as PERIOD_ID8_21_1_, submittedf0_.PERMIT_ID as PERMIT_ID9_21_1_ from TU_SUBMITTED_FORM submittedf0_ where submittedf0_.PERMIT_ID=? and submittedf0_.PERIOD_ID=?
因此当我调用 Dozer 将其映射到我的新 bean 时,hibernate 正在调用 SQL 延迟加载此数据,但在调试器中我可以看到实体集,尽管现在在 dozer 映射之后初始化, 是空的,即使它应该有三个记录。
这已经实际工作了两个星期,而且我没有更改任何代码。知道为什么这会突然停止工作吗?
答案是我们的测试数据设置了相等的 permitId 和 periodId 值 (1,1 2,2 3,3)。当我们擦除数据库并开始使用应用程序生成的数据时,PERMIT_ID 和 PERIOD_ID 在关系中颠倒了,因为我没有包含 referencedColumnName 属性。当我将负载更改为 EAGER 时,连接语句非常明显地表明出了什么问题(OUTER JOIN ON PermitPeriod.permitId = SubmittedForm.periodId AND PermitPeriod.periodId = SubmittedForm.permitId)。
如果出现运行时错误就好了,Hibernate。相反,您将这些列随机映射在一起,即使它们的名称完全相同。
我有一个包含一对多关系的 class。检索工作正常,然后有人访问了数据库,现在检索无法填充集合。
关系:
父实体:许可期限
@OneToMany(fetch=FetchType.LAZY, mappedBy = "permitPeriodEntity")
@Cascade({CascadeType.ALL})
private Set<SubmittedFormEntity> submittedForms;
子实体:已提交表单
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns( {
@JoinColumn(name = "PERMIT_ID", insertable = false, updatable = false),
@JoinColumn(name = "PERIOD_ID", insertable = false, updatable = false)
})
private PermitPeriodEntity permitPeriodEntity;
当我将对象传递给 Dozer(延迟加载)时实际生成 SQL
Hibernate: select submittedf0_.PERMIT_ID as PERMIT_ID9_21_0_, submittedf0_.PERIOD_ID as PERIOD_ID8_21_0_, submittedf0_.FORM_ID as FORM_ID1_21_0_, submittedf0_.FORM_ID as FORM_ID1_21_1_, submittedf0_.CREATED_BY as CREATED_BY2_21_1_, submittedf0_.CREATED_DT as CREATED_DT3_21_1_, submittedf0_.FORM_NUM as FORM_NUM4_21_1_, submittedf0_.FORM_TYPE_CD as FORM_TYPE_CD5_21_1_, submittedf0_.MODIFIED_BY as MODIFIED_BY6_21_1_, submittedf0_.MODIFIED_DT as MODIFIED_DT7_21_1_, submittedf0_.PERIOD_ID as PERIOD_ID8_21_1_, submittedf0_.PERMIT_ID as PERMIT_ID9_21_1_ from TU_SUBMITTED_FORM submittedf0_ where submittedf0_.PERMIT_ID=? and submittedf0_.PERIOD_ID=?
因此当我调用 Dozer 将其映射到我的新 bean 时,hibernate 正在调用 SQL 延迟加载此数据,但在调试器中我可以看到实体集,尽管现在在 dozer 映射之后初始化, 是空的,即使它应该有三个记录。
这已经实际工作了两个星期,而且我没有更改任何代码。知道为什么这会突然停止工作吗?
答案是我们的测试数据设置了相等的 permitId 和 periodId 值 (1,1 2,2 3,3)。当我们擦除数据库并开始使用应用程序生成的数据时,PERMIT_ID 和 PERIOD_ID 在关系中颠倒了,因为我没有包含 referencedColumnName 属性。当我将负载更改为 EAGER 时,连接语句非常明显地表明出了什么问题(OUTER JOIN ON PermitPeriod.permitId = SubmittedForm.periodId AND PermitPeriod.periodId = SubmittedForm.permitId)。
如果出现运行时错误就好了,Hibernate。相反,您将这些列随机映射在一起,即使它们的名称完全相同。