代码之家  ›  专栏  ›  技术社区  ›  Arlo Guthrie

Oracle一对多检索失败,Hibernate 5.1.1.Final

  •  0
  • Arlo Guthrie  · 技术社区  · 8 年前

    我有一个包含一对多关系的类。检索工作正常,然后有人触摸了数据库,现在检索无法填充集合。

    关系:

    母实体:许可期

    @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映射之后初始化,但它是空的,即使它应该有三个记录。

    这已经工作了两周了,我没有修改任何代码。你知道为什么这会突然停止工作吗?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Arlo Guthrie    8 年前

    答案是,我们的测试数据设置了相等的permitId和periodId值(1,1,2,2,3,3)。当我们擦除数据库并开始使用应用程序生成的数据时,PERMIT_ID和PERIOD_ID在整个关系中被反转,因为我没有包含referencedColumnName属性。当我将load更改为EAGER时,join语句使问题变得非常明显(PermitPeriod.permitId=SubmittedForm.periodId和PermittedPeriod.periodId=SubmitedForm.permitId上的外部连接)。

    一个运行时错误会很好,Hibernate。相反,您将这些列随机映射到一起,即使它们的名称完全相同。