Skip to content

Commit da40ed8

Browse files
committed
HHH-18563 Add test using foreign key property
1 parent 8c8ede3 commit da40ed8

File tree

4 files changed

+53
-11
lines changed

4 files changed

+53
-11
lines changed

hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteInsertHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1299,7 +1299,7 @@ private List<Assignment> getCompatibleAssignments(InsertSelectStatement dmlState
12991299
final List<Assignment> assignments = conflictClause.getAssignments();
13001300
for ( Assignment assignment : assignments ) {
13011301
for ( ColumnReference targetColumn : dmlStatement.getTargetColumns() ) {
1302-
if ( targetColumn.equals( assignment.getAssignable() ) ) {
1302+
if ( assignment.getAssignable().getColumnReferences().contains( targetColumn ) ) {
13031303
if ( compatibleAssignments == null ) {
13041304
compatibleAssignments = new ArrayList<>( assignments.size() );
13051305
}

hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/EntityValuedPathInterpretation.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import org.hibernate.dialect.Dialect;
1313
import org.hibernate.dialect.FunctionalDependencyAnalysisSupport;
1414
import org.hibernate.metamodel.mapping.BasicValuedModelPart;
15-
import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart;
1615
import org.hibernate.metamodel.mapping.EntityAssociationMapping;
1716
import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping;
1817
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;

hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,10 +1241,10 @@ protected void visitSetAssignment(Assignment assignment) {
12411241
}
12421242
}
12431243
final List<ColumnReference> columnReferences = assignable.getColumnReferences();
1244+
final Expression assignedValue = assignment.getAssignedValue();
12441245
if ( columnReferences.size() == 1 ) {
12451246
columnReferences.get( 0 ).appendColumnForWrite( this, null );
12461247
appendSql( '=' );
1247-
final Expression assignedValue = assignment.getAssignedValue();
12481248
final SqlTuple sqlTuple = SqlTupleContainer.getSqlTuple( assignedValue );
12491249
if ( sqlTuple != null ) {
12501250
assert sqlTuple.getExpressions().size() == 1;
@@ -1254,15 +1254,28 @@ protected void visitSetAssignment(Assignment assignment) {
12541254
assignedValue.accept( this );
12551255
}
12561256
}
1257-
else {
1257+
else if ( assignedValue instanceof SelectStatement ) {
12581258
char separator = OPEN_PARENTHESIS;
12591259
for ( ColumnReference columnReference : columnReferences ) {
12601260
appendSql( separator );
12611261
columnReference.appendColumnForWrite( this, null );
12621262
separator = COMMA_SEPARATOR_CHAR;
12631263
}
12641264
appendSql( ")=" );
1265-
assignment.getAssignedValue().accept( this );
1265+
assignedValue.accept( this );
1266+
}
1267+
else {
1268+
assert assignedValue instanceof SqlTupleContainer;
1269+
final List<? extends Expression> expressions = ( (SqlTupleContainer) assignedValue ).getSqlTuple().getExpressions();
1270+
columnReferences.get( 0 ).appendColumnForWrite( this, null );
1271+
appendSql( '=' );
1272+
expressions.get( 0 ).accept( this );
1273+
for ( int i = 1; i < columnReferences.size(); i++ ) {
1274+
appendSql( ',' );
1275+
columnReferences.get( i ).appendColumnForWrite( this, null );
1276+
appendSql( '=' );
1277+
expressions.get( i ).accept( this );
1278+
}
12661279
}
12671280
}
12681281

hibernate-core/src/test/java/org/hibernate/orm/test/flush/AutoFlushOnUpdateQueryTest.java

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
15
package org.hibernate.orm.test.flush;
26

3-
import org.hibernate.testing.jdbc.SQLStatementInspector;
47
import org.hibernate.testing.orm.junit.DomainModel;
58
import org.hibernate.testing.orm.junit.SessionFactory;
69
import org.hibernate.testing.orm.junit.SessionFactoryScope;
@@ -22,9 +25,7 @@
2225
AutoFlushOnUpdateQueryTest.Fruit.class,
2326
}
2427
)
25-
@SessionFactory(
26-
statementInspectorClass = SQLStatementInspector.class
27-
)
28+
@SessionFactory
2829
public class AutoFlushOnUpdateQueryTest {
2930

3031
public static final String FRUIT_NAME = "Apple";
@@ -50,8 +51,6 @@ public void tearDown(SessionFactoryScope scope) {
5051

5152
@Test
5253
public void testFlushIsExecuted(SessionFactoryScope scope) {
53-
SQLStatementInspector statementInspector = scope.getStatementInspector( SQLStatementInspector.class );
54-
statementInspector.clear();
5554
scope.inTransaction(
5655
session -> {
5756
Fruit fruit = session
@@ -81,6 +80,37 @@ public void testFlushIsExecuted(SessionFactoryScope scope) {
8180
);
8281
}
8382

83+
@Test
84+
public void testFlushIsExecuted2(SessionFactoryScope scope) {
85+
scope.inTransaction(
86+
session -> {
87+
Fruit fruit = session
88+
.createQuery(
89+
"select f from Fruit f where f.name = :name",
90+
Fruit.class
91+
).setParameter( "name", FRUIT_NAME ).getSingleResult();
92+
93+
FruitLogEntry logEntry = new FruitLogEntry( fruit, "foo" );
94+
session.persist( logEntry );
95+
96+
session.createMutationQuery( "update Fruit f set f.logEntry.id = :logEntryId where f.id = :fruitId" )
97+
.setParameter( "logEntryId", logEntry.getId() )
98+
.setParameter( "fruitId", fruit.getId() ).executeUpdate();
99+
}
100+
);
101+
102+
scope.inTransaction(
103+
session -> {
104+
Fruit fruit = session
105+
.createQuery(
106+
"select f from Fruit f where f.name = :name",
107+
Fruit.class
108+
).setParameter( "name", FRUIT_NAME ).getSingleResult();
109+
assertThat( fruit.getLogEntry() ).isNotNull();
110+
}
111+
);
112+
}
113+
84114
@Entity(name = "Fruit")
85115
public static class Fruit {
86116

0 commit comments

Comments
 (0)