@OneToMany
Parent->Child->Child->Child DB 関係に使用します。
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "THE_ID", nullable = false )
private List<ChildClass> children = new ArrayList<ChildClass>();
大量のデータ (100K の挿入) を使用するシナリオでは、挿入時にパフォーマンスが大幅に低下します (実際にはタイムアウトになります)。ただし、少量のデータ (1K 挿入) の場合は問題ありません。
そのため、正当な理由がないためnullable = false
、子テーブルの DB 外部キーを削除して変更し、null を許可すると、パフォーマンスが非常に良好になりました。誰でもこれを説明できますか?
更新:デバッグをオンにしました..nullable = false
子テーブルのIDを生成する大きなボトルネックがあるようです。ID が生成されるのを待ってタイムアウトし、これがログに何度も記録されます。
[org.hibernate.event.def.AbstractSaveEventListener] [ ] generated identifier: <743088>, using strategy: org.hibernate.id.IncrementGenerator
DBにデータを挿入することさえできません。id gen に行き詰まっています。現在、子テーブルに現在ある最大 ID 値を見て ID を生成するように Hibernate を設定します。
@Id
@GeneratedValue(generator = "DummyString")
@GenericGenerator(name = "DummyString", strategy = "increment")
@Column(name = "THE_ID", nullable = false)
private Long id;
これより前は、DB シーケンスを使用していましたが、同じ問題が発生していました。
を省略するnullable = false
と、これらの ID gen ステートメント (108K) が表示されますが、25 秒で完了します。では、なぜこれらのステートメントは (文字通り) 永遠にかかるのnullable = false
でしょうか?