Hibernate order_inserts не работает должным образом при каскадировании
Я настроил спящий режим для пакетной вставки/обновления объектов с помощью следующих свойств:
app.db.props.hibernate.jdbc.batch_size=50
app.db.props.hibernate.batch_versioned_data=true
app.db.props.hibernate.order_inserts=true
app.db.props.hibernate.order_updates=true
(Игнорируйте префикс app.db.props, он удален Spring). Я могу подтвердить, что свойства переводят его в спящий режим, потому что простые пакеты работают, как и ожидалось, что подтверждается ведением журнала напрямую через источник данных. Приведенный ниже прокси создает журнал, чтобы показать, что происходят пакеты.
ProxyDataSourceBuilder.create(dataSource)
.asJson().countQuery()
.logQueryToSysOut().build();
Журналы (обратите внимание на размер партии)...
{"name":"", "connection":121, "time":1, "success":true, "type":"Prepared", "batch":true, "querySize":1, "batchSize":18, "query":["update odm.status set first_timestamp=?, last_timestamp=?, removed=?, conformant=?, event_id=?, form_id=?, frozen=?, group_id=?, item_id=?, locked=?, study_id=?, subject_id=?, verified=? where id=?"], "params":[...]}
Однако при вставке более сложной объектной модели, включающей иерархию отношений 1-*, спящий режим не упорядочивает вставки (и, следовательно, не группирует). С такой моделью, как EntityA -> EntityB -> EntityC, спящий режим вставляет каждого родителя и дочернего элемента, а затем выполняет итерацию, а не пакетную обработку каждого класса сущностей.
То есть я вижу несколько вставок для каждого типа...
insert EntityA...
insert EntityB...
insert EntityC...
insert EntityA...
insert EntityB...
insert EntityC...
repeat...
Но я бы ожидал, что это будет одна итерация с использованием массовой вставки для каждого типа.
Кажется, что каскадные отношения препятствуют упорядочению вставок (и массовой вставки), но я не могу понять, почему. Hibernate должен уметь понимать, что все экземпляры EntityA можно вставить и один раз, затем EntityB и так далее.