问题
PROBLEM:
Why changing the order of the joinColumn, hibernate return a correct or incorrect query?
FIRST JOIN:
@OneToOne
@JoinTable(name="TTR_POA_UPA",
joinColumns = {
@JoinColumn(name="ANO", insertable=false, updatable=false),
@JoinColumn(name="ID_ESCALA", insertable=false, updatable=false),
@JoinColumn(name="MES", insertable=false, updatable=false)
},
inverseJoinColumns = {
@JoinColumn(name="ANO", insertable=false, updatable=false),
@JoinColumn(name="ID_ESCALA", insertable=false, updatable=false),
@JoinColumn(name="MES", insertable=false, updatable=false)
}
)
private PoaUpa poaUpa;
Return:
Hibernate: select * from ( select autorizaci0_.ano as ano0_, autorizaci0_.ID_ESCALA as ID2_0_, autorizaci0_.mes as mes0_, autorizaci0_.AUTORIZACION_HORAS_DIA_FIJIS as AUTORIZA4_0_, autorizaci0_.AUTORIZACION_HORAS_EVENT as AUTORIZA5_0_, autorizaci0_.AUTORIZACION_HORAS_FACTP as AUTORIZA6_0_, autorizaci0_.AUTORIZACION_HORAS_FIJIS as AUTORIZA7_0_, autorizaci0_.AUTORIZACION_HORAS_FIJOS as AUTORIZA8_0_, autorizaci0_.AUTORIZACION_HORAS_SEM_FACTP as AUTORIZA9_0_, autorizaci0_.AUTORIZACION_NAP as AUTORIZ10_0_, autorizaci0_.AUTORIZACION_NUM_PERS_EVENT as AUTORIZ11_0_, autorizaci0_.AUTORIZACION_OBSERVACIONES as AUTORIZ12_0_, autorizaci0_.PETICION_HORAS_DIA_FIJIS as PETICION13_0_, autorizaci0_.PETICION_HORAS_EVENT as PETICION14_0_, autorizaci0_.PETICION_HORAS_FACTP as PETICION15_0_, autorizaci0_.PETICION_HORAS_FIJIS as PETICION16_0_, autorizaci0_.PETICION_HORAS_FIJOS as PETICION17_0_, autorizaci0_.PETICION_HORAS_SEM_FACTP as PETICION18_0_, autorizaci0_.PETICION_NAP as PETICION19_0_, autorizaci0_.PETICION_NUM_PERS_EVENT as PETICION20_0_, autorizaci0_.PETICION_OBSERVACIONES as PETICION21_0_, autorizaci0_.REALIZACION_HORAS_DIA_FIJIS as REALIZA22_0_, autorizaci0_.REALIZACION_HORAS_EVENT as REALIZA23_0_, autorizaci0_.REALIZACION_HORAS_FACTP as REALIZA24_0_, autorizaci0_.REALIZACION_HORAS_FIJIS as REALIZA25_0_, autorizaci0_.REALIZACION_HORAS_FIJOS as REALIZA26_0_, autorizaci0_.REALIZACION_HORAS_SEM_FACTP as REALIZA27_0_, autorizaci0_.REALIZACION_NAP as REALIZA28_0_, autorizaci0_.REALIZACION_NUM_PERS_EVENT as REALIZA29_0_, autorizaci0_.REALIZACION_OBSERVACIONES as REALIZA30_0_, autorizaci0_1_.ANO as ANO1_, autorizaci0_1_.ID_ESCALA as ID2_1_, autorizaci0_1_.MES as MES1_ from TTR_AUTORIZACION autorizaci0_ left outer join TTR_POA_UPA autorizaci0_1_ on autorizaci0_.ano=autorizaci0_1_.ANO and autorizaci0_.ID_ESCALA=autorizaci0_1_.ID_ESCALA and autorizaci0_.mes=autorizaci0_1_.MES where autorizaci0_.ano=? and autorizaci0_.mes=? and autorizaci0_.ID_ESCALA=? ) where rownum <= ?
With this join:
on autorizaci0_.ano=autorizaci0_1_.ANO and autorizaci0_.ID_ESCALA=autorizaci0_1_.ID_ESCALA
AND SECOND JOIN:
@OneToOne
@JoinTable(name="TTR_POA_UPA",
joinColumns = {
@JoinColumn(name="ID_ESCALA", insertable=false, updatable=false),
@JoinColumn(name="ANO", insertable=false, updatable=false),
@JoinColumn(name="MES", insertable=false, updatable=false)
},
inverseJoinColumns = {
@JoinColumn(name="ID_ESCALA", insertable=false, updatable=false),
@JoinColumn(name="ANO", insertable=false, updatable=false),
@JoinColumn(name="MES", insertable=false, updatable=false)
} )
private PoaUpa poaUpa;
Return:
Hibernate: select * from ( select autorizaci0_.ano as ano0_, autorizaci0_.ID_ESCALA as ID2_0_, autorizaci0_.mes as mes0_, autorizaci0_.AUTORIZACION_HORAS_DIA_FIJIS as AUTORIZA4_0_, autorizaci0_.AUTORIZACION_HORAS_EVENT as AUTORIZA5_0_, autorizaci0_.AUTORIZACION_HORAS_FACTP as AUTORIZA6_0_, autorizaci0_.AUTORIZACION_HORAS_FIJIS as AUTORIZA7_0_, autorizaci0_.AUTORIZACION_HORAS_FIJOS as AUTORIZA8_0_, autorizaci0_.AUTORIZACION_HORAS_SEM_FACTP as AUTORIZA9_0_, autorizaci0_.AUTORIZACION_NAP as AUTORIZ10_0_, autorizaci0_.AUTORIZACION_NUM_PERS_EVENT as AUTORIZ11_0_, autorizaci0_.AUTORIZACION_OBSERVACIONES as AUTORIZ12_0_, autorizaci0_.PETICION_HORAS_DIA_FIJIS as PETICION13_0_, autorizaci0_.PETICION_HORAS_EVENT as PETICION14_0_, autorizaci0_.PETICION_HORAS_FACTP as PETICION15_0_, autorizaci0_.PETICION_HORAS_FIJIS as PETICION16_0_, autorizaci0_.PETICION_HORAS_FIJOS as PETICION17_0_, autorizaci0_.PETICION_HORAS_SEM_FACTP as PETICION18_0_, autorizaci0_.PETICION_NAP as PETICION19_0_, autorizaci0_.PETICION_NUM_PERS_EVENT as PETICION20_0_, autorizaci0_.PETICION_OBSERVACIONES as PETICION21_0_, autorizaci0_.REALIZACION_HORAS_DIA_FIJIS as REALIZA22_0_, autorizaci0_.REALIZACION_HORAS_EVENT as REALIZA23_0_, autorizaci0_.REALIZACION_HORAS_FACTP as REALIZA24_0_, autorizaci0_.REALIZACION_HORAS_FIJIS as REALIZA25_0_, autorizaci0_.REALIZACION_HORAS_FIJOS as REALIZA26_0_, autorizaci0_.REALIZACION_HORAS_SEM_FACTP as REALIZA27_0_, autorizaci0_.REALIZACION_NAP as REALIZA28_0_, autorizaci0_.REALIZACION_NUM_PERS_EVENT as REALIZA29_0_, autorizaci0_.REALIZACION_OBSERVACIONES as REALIZA30_0_, autorizaci0_1_.ID_ESCALA as ID2_1_, autorizaci0_1_.ANO as ANO1_, autorizaci0_1_.MES as MES1_ from TTR_AUTORIZACION autorizaci0_ left outer join TTR_POA_UPA autorizaci0_1_ on autorizaci0_.ano=autorizaci0_1_.ID_ESCALA and autorizaci0_.ID_ESCALA=autorizaci0_1_.ANO and autorizaci0_.mes=autorizaci0_1_.MES where autorizaci0_.ano=? and autorizaci0_.mes=? and autorizaci0_.ID_ESCALA=? ) where rownum <= ?
With this incorrect join:
on autorizaci0_.ano=autorizaci0_1_.ID_ESCALA and autorizaci0_.ID_ESCALA=autorizaci0_1_.ANO
SOLUTION:
The solution that works perfect is: (thanks @JB Nizet)
@OneToOne
@JoinTable(name="TTR_POA_UPA",
joinColumns = {
@JoinColumn(name="ANO", insertable=false, updatable=false, referencedColumnName="ANO"),
@JoinColumn(name="ID_ESCALA", insertable=false, updatable=false, referencedColumnName="ID_ESCALA"),
@JoinColumn(name="MES", insertable=false, updatable=false, referencedColumnName="MES")
},
inverseJoinColumns = {
@JoinColumn(name="ANO", insertable=false, updatable=false, referencedColumnName="ANO"),
@JoinColumn(name="ID_ESCALA", insertable=false, updatable=false, referencedColumnName="ID_ESCALA"),
@JoinColumn(name="MES", insertable=false, updatable=false, referencedColumnName="MES")
}
)
private PoaUpa poaUpa;
回答1:
The join columns of the join table reference columns from the joined tables. It works by accident in the first case because the order of the columns constituting the ID of the entity is the same as the order of the join columns. You should specify the referenced column name of each join column, to make things clearer and safer:
@JoinColumn(name="ID_ESCALA", insertable=false, updatable=false, referencedColumnName="ID_ASCALA"),
@JoinColumn(name="ANO", insertable=false, updatable=false, referencedColumnName="ANO"),
...
A OneToOne with a join table is really really strange, though.
来源:https://stackoverflow.com/questions/11342733/why-changing-the-order-of-the-joincolumn-hibernate-return-a-correct-or-incorrec