Hi dear Hibernate community!
We are using createCriteriaInsertValues
, createCriteriaInsertSelect
apis, and found out a problem with onConflict
:
var insertIntoItem = cb.createCriteriaInsertValues(ItemEntity.class);
insertIntoItem.setInsertionTargetPaths(insertIntoItem.getTarget().get(ItemEntity_.ITEM_ID));
insertIntoItem.values(cb.values(cb.value(UUID.randomUUID())));
insertIntoItem.onConflict().onConflictDoNothing(); // The problem is here.
entityManager.unwrap(Session.class).createMutationQuery(insertIntoItem).executeUpdate();
Using of onConflict
leads to StackOverflowError
:
java.lang.StackOverflowError: null
at org.hibernate.query.sqm.tree.expression.ValueBindJpaCriteriaParameter.copy(ValueBindJpaCriteriaParameter.java:18) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmValues.<init>(SqmValues.java:31) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmValues.copy(SqmValues.java:36) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:82) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:36) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmConflictClause.copy(SqmConflictClause.java:157) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:94) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:36) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmConflictClause.copy(SqmConflictClause.java:157) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:94) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:36) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmConflictClause.copy(SqmConflictClause.java:157) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:94) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:36) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmConflictClause.copy(SqmConflictClause.java:157) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:94) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:36) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmConflictClause.copy(SqmConflictClause.java:157) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:94) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
at org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement.copy(SqmInsertValuesStatement.java:36) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
The same is reproducible for createCriteriaInsertSelect.onConflict
on hibernate-core 6.5.3.Final
The workaround is to turn the copy tree off in the application props: hibernate.criteria.copy_tree=false
I’d like to ask, maybe I’m doing something wrong in the code snippet above?
Thank you.