1. ホーム
  2. java

[解決済み] JPA Hibernateを使った子オブジェクトの自動保存

2023-06-16 13:33:52

質問

親テーブルと子テーブルの間に一対多の関係を持っています。 親オブジェクトに

List<Child> setChildren(List<Child> childs)

また、Childテーブルには外部キーがあります。この外部キーは、データベース内の親の行を参照するIDです。 そのため、私のデータベース設定では、この外部キーはNULLにすることができません。 また、この外部キーは親テーブルの主キーでもあります。

そこで質問ですが、次のような方法で自動的に子オブジェクトを保存することができます。

session.save(parent);

上記を試してみましたが、Childテーブルの外部キーフィールドはNULLではありえないというデータベースエラーが発生します。子オブジェクトを自動的に保存できるように、JPAにこの外部キーを子オブジェクトに自動的に設定するよう指示する方法はありますか?

事前にありがとうございます。

どのように解決するのですか?

<ブロッククオート

上記を試してみましたが、Childテーブルの外部キーフィールドはNULLではありえないというデータベースエラーが発生します。子オブジェクトを自動的に保存できるように、JPAにこの外部キーを子オブジェクトに自動的に設定するよう指示する方法はありますか?

さて、ここには2つのことがあります。

まず、保存操作をカスケードする必要があります (しかし、私の理解では、これを実行しているか、または "子テーブルへの挿入中に FK 制約違反が発生しないかです)。

次に、おそらく双方向の関連付けがあり、"リンクの両側" を正しく設定していないのだと思います。このようなことをすることになっています。

Parent parent = new Parent();
...
Child c1 = new Child();
...
c1.setParent(parent);

List<Child> children = new ArrayList<Child>();
children.add(c1);
parent.setChildren(children);

session.save(parent);

よくあるパターンは、リンク管理の方法です。

@Entity
public class Parent {
    @Id private Long id;

    @OneToMany(mappedBy="parent")
    private List<Child> children = new ArrayList<Child>();

    ...

    protected void setChildren(List<Child> children) {
        this.children = children;
    }

    public void addToChildren(Child child) {
        child.setParent(this);
        this.children.add(child);
    }
}

そして、コードはこうなる。

Parent parent = new Parent();
...
Child c1 = new Child();
...

parent.addToChildren(c1);

session.save(parent);

参考文献