@OneToOneアノテーションの保存
public class Order implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@OneToOne( fetch = FetchType.EAGER ,cascade = CascadeType.ALL)
@JoinColumn(name="weddings_tbl_id")
private WeddingsTbl weddingsTbl;
}
public class WeddingsTbl implements Serializable{
// フィールド省略
}
Orderテーブル
weddings_tbl_id外部キーを持っている
weddings_tblを参照する
Weddings_tblテーブル
外部キーを持っていない
つまり、Orderの中にWeddingsTblエンティティが入っている
orderRepository.save(order, weddingsTbl)でdetached entity passed to persistが発生する
どうやらorderを保存したいけど、weddingsTblの影響を受けているよう。詳しい原因はわからない。。。(どなたか教えていただければ助かります)
エラーが発生している箇所
コントローラー
orderService.create(order);
サービス
public void create(Order order, WeddingsTbl weddingsTbl){
order.setWeddingsTbl(weddingsTbl);
orderRepository.save(order); // ここでエラーが発生する
}
まずは参照先のテーブルを保存する!
public void create(Order order, WeddingsTbl weddingsTbl){
weddingsTbl = weddingsTblRepository.save(weddingsTbl); // これを追加
order.setWeddingsTbl(weddingsTbl);
orderRepository.save(order); // ここでエラーが発生する
}
まずは外部キーで参照している先のWeddingsTblエンティティをデータベースに保存する
saveメソッドで返ってくるweddingsTblをorderにセットする
EntityManager によって管理されるEntityオブジェクトは、saveメソッドから返却されたEntityオブジェクトになるので注意すること。
EntityManager によって管理されるEntityオブジェクトは、saveメソッドの引数に渡したEntityオブジェクトではなく、saveメソッドから返却されたEntityオブジェクトになるので注意すること。
EntityManager
というのが正直わかりませんw
また調べます。
EntityManagerの管理化かどうかが大事みたい
EntityManagerというものがなにかもわかっていない状態なので、DB取得、更新などの操作をするときにエラーが発生するのだろうと思います。
今回に関しては
引数のweddingsTblと
saveメソッドの返り値のweddingsTblは
違うものだということ!!