親レコードがデータベースに既に存在する新しい子レコードを、クエリで親を最初にフェッチしてから新しい子を挿入することなく挿入したいとします。親を挿入しないでHibernateを保存する子エンティティ
例:
@NotNull
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "catalog_id",
referencedColumnName = "id", foreignKey = @ForeignKey(name = "FK_product_catalog"))
private Catalog catalog;
私は最初のクエリにせずに、カタログに新製品を挿入することができるようにしたい:私は既存のカタログエンティティとManyToOneを持っている製品のエンティティを、持っています新しい製品エンティティを埋めるためのカタログ。
実際、restControllerのPOSTでjsonを受け取りました.Jsonにはproduct属性とカタログIDが含まれています。ここ
は、JSONである:
{
"id":1,
"attribute1":"value",
"catalog":{"id":1}
}
シリアライゼーションが発生すると、製品のインスタンスが正しくだけidフィールドの値を持っているカタログのインスタンスを含んで形成されています。
私は挿入時にこのメッセージを受信しています:保存されていない一時エンティティと非NULL可能 関連
を有する1つのまたは複数のエンティティを保存しようとすると
私が受け取る理由を私は理解してこのメッセージは、私もデータベースからカタログの行を得ることができますが、私は実際には外来のキーを持つ行を挿入しているので、私は意識していない子の行を挿入するたびにすべての親を照会する必要がある参照。
誰もこの種の動作を防止する方法を知っていますか?
私は当初、データベースddlをhibernateで生成させたいと思っていましたが、私はまだそのように動作させようとしています。また、データベースから製品を選択すると、そのカタログが熱心に取り出されるようになります。しかし、製品を挿入する場合、カタログ部分に対して追加の選択を実行することなく、カタログ行を製品行に挿入したいだけです。 –
私には非常に標準的な機能性のようです。私はselectでeager fetchをしたいが、商品エンティティのみを挿入し、カタログが存在しない場合はデータベースに外部キー制約を適用させる。 –
あなたが提案したことを試してみて、それが問題を解決しました。 ManyToOneリレーションシップをCatalog(insertおよびupdate = falseを使用)にしてcatalog_idフィールドを追加することで、親リレーションのidだけを持つことでproductエンティティのみを挿入できるようになりました。それでも、エンティティに重複があると(catalog.idとcatalod_idフィールドの両方を持つ)、長期的には問題が発生する可能性がありますが、挿入時に複数の無駄な選択を行うよりも優れています。 –