更新:私は反対のことをすることで問題を「解決」することになりました!これで、エンティティ参照フィールドが読み取り専用(insertable = false updatable = false)に設定され、外部キーフィールドが読み取り/書き込みに設定されました。これは、新しいエンティティを保存するときに特別な注意を払う必要があることを意味しますが、クエリを実行すると、エンティティのプロパティが解決されます。
ドメインモデルに双方向の1対多の関連付けがあり、永続性プロバイダーとしてJPAアノテーションとHibernateを使用しています。これはほとんどあなたの標準的な親/子構成ですが、1つの違いは、親の外部キーを、次のように、親インスタンスへの参照と一緒に子の個別のプロパティとして公開することです。
@Entity
public class Child {
@Id @GeneratedValue
Long id;
@Column(name="parent_id", insertable=false, updatable=false)
private Long parentId;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="parent_id")
private Parent parent;
private long timestamp;
}
@Entity
public class Parent {
@Id @GeneratedValue
Long id;
@OrderBy("timestamp")
@OneToMany(mappedBy="parent", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
private List<Child> children;
}
これはほとんどの場合問題なく機能しますが、最初に偽の親を作成せずに、parent_id列に無効な値を入れたい場合が多くあります(レガシー)。
残念ながら、Hibernateは、がparentId
原因でフィールドに割り当てられた値を保存しませんinsertable=false, updatable=false
。これは、同じ列が複数のプロパティにマップされている場合に必要です。JDBCにドロップダウンしたり、インターセプターを実装したりせずに、「Hibernateの後ろに隠れて」そのフィールドに値を忍び込ませる良い方法はありますか?
ありがとう!