0

EclipseLink を使用して、データベース (Oracle 11g) を JPA エンティティにマッピングしています。ほとんどすべてのテーブルを JPA オブジェクトにマップしましたが、問題が見つかりました。

\Curve\ エンティティには、次のフィールドがあります。

@Id
@Column(name = "COD_CURVE")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq.gen")
@SequenceGenerator(name = "seq.gen.curve", sequenceName = "SEQCURVE", allocationSize = 1)
private long codCurve;

@Id
@Column(name = "FEC_HISTORIC")
@Temporal(javax.persistence.TemporalType.DATE)
private Date fecHistoric;

@OneToMany(mappedBy="codCurve", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Collection<CurveDetail> detailsCollection;

\CurveDetail\ エンティティには、次のものがあります。

@ManyToOne
@JoinColumns({
    @JoinColumn(name = "COD_CURVE", referencedColumnName = "COD_CURVE"),
    @JoinColumn(name = "FEC_HISTORIC", referencedColumnName = "FEC_HISTORIC")
})
private Curve codCurve;

問題は、\Curve\ エンティティをクエリすると、両方のテーブルに有効なデータがあるにもかかわらず、詳細が常に null になることです。データベースをチェックすると、\CurveDetail\ テーブルに外部キー制約がないことに気がついたので、これらの制約はデータベースを正しくマップするために必要ですか? 許可されていないため、自分で FK 制約を追加しようとはしていません (DBA に依頼する必要があり、1 週間かかります)。

前もって感謝します!

4

2 に答える 2

1

外部キーを持つ必要はありません。

ロギングを有効にして生成される SQL を確認します ("eclipselink.logging.level"="finest")

同じデータベースで同じ SQL を実行して、データが存在するかどうかを確認してください。

また、null コレクションを持つオブジェクトを挿入/更新して、共有キャッシュを破損していないことを確認してください。双方向の関係の両側を維持する必要があります。キャッシュを無効にして、これが実行中かどうかを確認できます。

于 2013-03-25T14:31:40.160 に答える
0

私が知っているように、FK制約を持つことは必須ではありません。同じ問題が発生し(ただし、Oracle 9iでした)、エンティティクラスの名前がマップするテーブルの名前と一致する必要があることがわかりました。また、JPASQLとHibernateHQLはどちらも大文字と小文字が区別されるため、記述には注意が必要です。 @Columnタグ。

于 2013-03-22T12:42:33.643 に答える