2016-11-29 2 views
0

私は1対多の関係を持つクラスを持っています。検索はうまくいきましたが、誰かがデータベースに触れましたが、今度は検索に失敗してしまいます。Oracleの1対多の検索に失敗し、Hibernate 5.1.1.Final

関係:

親エンティティ:許可期間

@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; 

私はオブジェクトを渡すときに生成される実際の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=? 

だから、今ドーザマッピング後initialzedかかわらず、私は私の新しいBeanにマップするドーザーを呼び出すときに遅延し、このデータをロードするためにSQLを呼び出しているが、デバッガで、私は、エンティティのセットを見ることができます休止状態でありますそれは3つのレコードを持つ必要がありますが空です。

これは文字通り2週間続いており、コードは変更されていません。なぜこれが突然仕事を止めるのか?

+0

負荷タイプを熱心に変更して問題を発見しました。 Hibernateは結合列を逆転させます。我々が与えられた舞台データは1,1,2,3,3の許可/期間の組み合わせを有していた。実際のデータが表示されているので、permitId = periodIdに参加しようとしているため失敗し、その逆もあります。 –

+0

私は自分のコンピュータに戻っていませんが、この問題は参照されている列名を自分の結合列に追加する必要があると思います。 –

答えて

0

私たちのテストデータは、同等のpermitId値とperiodId値(1,1,2,3,3,3)で設定されていたという回答でした。データベースを一掃し、アプリケーションによって生成されたデータの使用を開始すると、referencedColumnName属性が含まれていないため、PERMIT_IDとPERIOD_IDはリレーションシップ全体で逆転しました。私が負荷をEAGERに変更したとき、joinステートメントは何が間違っていたかを非常に明白にしました(OUTER JOIN ON PermitPeriod.permitId = SubmittedForm.periodIdとPermitPeriod.periodId = SubmittedForm.permitId)。

実行時エラーは、Hibernateがうまくいっているはずです。代わりに、まったく同じ名前が付けられていても、列を無作為にマップしました。

関連する問題