我们使用@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
并更改了子表上的数据库外键以允许空值,并且性能非常好。谁能解释一下?
更新:打开调试..nullable = false
似乎存在一个巨大的瓶颈,为子表生成 id。我们超时等待 id 生成,在日志中一遍又一遍:
[org.hibernate.event.def.AbstractSaveEventListener] [ ] generated identifier: <743088>, using strategy: org.hibernate.id.IncrementGenerator
我们甚至从未将数据插入数据库。我们只是停留在 id gen 上。目前我们配置 Hibernate 通过查看当前子表中的最大 id 值来生成 ID:
@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
?