Skip to content

Commit d759d4b

Browse files
committed
HHH-18563 Add test using foreign key property
1 parent 8252c8d commit d759d4b

File tree

6 files changed

+116
-27
lines changed

6 files changed

+116
-27
lines changed

gradle/databases.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ ext {
3636
'connection.init_sql' : ''
3737
],
3838
derby : [
39-
'db.dialect' : 'org.hibernate.dialect.DerbyDialect',
39+
'db.dialect' : 'org.hibernate.community.dialect.DerbyDialect',
4040
'jdbc.driver': 'org.apache.derby.iapi.jdbc.AutoloadedDriver',
4141
'jdbc.user' : 'hibernate_orm_test',
4242
'jdbc.pass' : 'hibernate_orm_test',
@@ -46,7 +46,7 @@ ext {
4646
'connection.init_sql' : ''
4747
],
4848
derby_old : [
49-
'db.dialect' : 'org.hibernate.dialect.DerbyDialect',
49+
'db.dialect' : 'org.hibernate.community.dialect.DerbyDialect',
5050
'jdbc.driver': 'org.apache.derby.jdbc.EmbeddedDriver',
5151
'jdbc.user' : 'hibernate_orm_test',
5252
'jdbc.pass' : 'hibernate_orm_test',

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/OracleLegacySqlAstTranslator.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.hibernate.sql.ast.tree.select.QueryPart;
5757
import org.hibernate.sql.ast.tree.select.QuerySpec;
5858
import org.hibernate.sql.ast.tree.select.SelectClause;
59+
import org.hibernate.sql.ast.tree.select.SelectStatement;
5960
import org.hibernate.sql.ast.tree.select.SortSpecification;
6061
import org.hibernate.sql.ast.tree.update.Assignable;
6162
import org.hibernate.sql.ast.tree.update.Assignment;
@@ -727,10 +728,10 @@ protected void visitSetAssignment(Assignment assignment) {
727728
}
728729
}
729730
final List<ColumnReference> columnReferences = assignment.getAssignable().getColumnReferences();
731+
final Expression assignedValue = assignment.getAssignedValue();
730732
if ( columnReferences.size() == 1 ) {
731733
columnReferences.get( 0 ).appendColumnForWrite( this );
732734
appendSql( '=' );
733-
final Expression assignedValue = assignment.getAssignedValue();
734735
final SqlTuple sqlTuple = SqlTupleContainer.getSqlTuple( assignedValue );
735736
if ( sqlTuple != null ) {
736737
assert sqlTuple.getExpressions().size() == 1;
@@ -740,7 +741,7 @@ protected void visitSetAssignment(Assignment assignment) {
740741
assignedValue.accept( this );
741742
}
742743
}
743-
else {
744+
else if ( assignedValue instanceof SelectStatement ) {
744745
char separator = OPEN_PARENTHESIS;
745746
for ( ColumnReference columnReference : columnReferences ) {
746747
appendSql( separator );
@@ -750,5 +751,18 @@ protected void visitSetAssignment(Assignment assignment) {
750751
appendSql( ")=" );
751752
assignment.getAssignedValue().accept( this );
752753
}
754+
else {
755+
assert assignedValue instanceof SqlTupleContainer;
756+
final List<? extends Expression> expressions = ( (SqlTupleContainer) assignedValue ).getSqlTuple().getExpressions();
757+
columnReferences.get( 0 ).appendColumnForWrite( this, null );
758+
appendSql( '=' );
759+
expressions.get( 0 ).accept( this );
760+
for ( int i = 1; i < columnReferences.size(); i++ ) {
761+
appendSql( ',' );
762+
columnReferences.get( i ).appendColumnForWrite( this, null );
763+
appendSql( '=' );
764+
expressions.get( i ).accept( this );
765+
}
766+
}
753767
}
754768
}

hibernate-core/src/main/java/org/hibernate/dialect/OracleSqlAstTranslator.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.hibernate.sql.ast.tree.select.QueryPart;
5555
import org.hibernate.sql.ast.tree.select.QuerySpec;
5656
import org.hibernate.sql.ast.tree.select.SelectClause;
57+
import org.hibernate.sql.ast.tree.select.SelectStatement;
5758
import org.hibernate.sql.ast.tree.select.SortSpecification;
5859
import org.hibernate.sql.ast.tree.update.Assignable;
5960
import org.hibernate.sql.ast.tree.update.Assignment;
@@ -680,10 +681,10 @@ protected void visitSetAssignment(Assignment assignment) {
680681
}
681682
}
682683
final List<ColumnReference> columnReferences = assignment.getAssignable().getColumnReferences();
684+
final Expression assignedValue = assignment.getAssignedValue();
683685
if ( columnReferences.size() == 1 ) {
684686
columnReferences.get( 0 ).appendColumnForWrite( this );
685687
appendSql( '=' );
686-
final Expression assignedValue = assignment.getAssignedValue();
687688
final SqlTuple sqlTuple = SqlTupleContainer.getSqlTuple( assignedValue );
688689
if ( sqlTuple != null ) {
689690
assert sqlTuple.getExpressions().size() == 1;
@@ -693,15 +694,28 @@ protected void visitSetAssignment(Assignment assignment) {
693694
assignedValue.accept( this );
694695
}
695696
}
696-
else {
697+
else if ( assignedValue instanceof SelectStatement ) {
697698
char separator = OPEN_PARENTHESIS;
698699
for ( ColumnReference columnReference : columnReferences ) {
699700
appendSql( separator );
700701
columnReference.appendColumnForWrite( this );
701702
separator = COMMA_SEPARATOR_CHAR;
702703
}
703704
appendSql( ")=" );
704-
assignment.getAssignedValue().accept( this );
705+
assignedValue.accept( this );
706+
}
707+
else {
708+
assert assignedValue instanceof SqlTupleContainer;
709+
final List<? extends Expression> expressions = ( (SqlTupleContainer) assignedValue ).getSqlTuple().getExpressions();
710+
columnReferences.get( 0 ).appendColumnForWrite( this, null );
711+
appendSql( '=' );
712+
expressions.get( 0 ).accept( this );
713+
for ( int i = 1; i < columnReferences.size(); i++ ) {
714+
appendSql( ',' );
715+
columnReferences.get( i ).appendColumnForWrite( this, null );
716+
appendSql( '=' );
717+
expressions.get( i ).accept( this );
718+
}
705719
}
706720
}
707721

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/sql/ast/spi/AbstractSqlAstTranslator.java

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,10 +1190,10 @@ protected void visitSetAssignment(Assignment assignment) {
11901190
}
11911191
}
11921192
final List<ColumnReference> columnReferences = assignable.getColumnReferences();
1193+
final Expression assignedValue = assignment.getAssignedValue();
11931194
if ( columnReferences.size() == 1 ) {
11941195
columnReferences.get( 0 ).appendColumnForWrite( this, null );
11951196
appendSql( '=' );
1196-
final Expression assignedValue = assignment.getAssignedValue();
11971197
final SqlTuple sqlTuple = SqlTupleContainer.getSqlTuple( assignedValue );
11981198
if ( sqlTuple != null ) {
11991199
assert sqlTuple.getExpressions().size() == 1;
@@ -1203,15 +1203,28 @@ protected void visitSetAssignment(Assignment assignment) {
12031203
assignedValue.accept( this );
12041204
}
12051205
}
1206-
else {
1206+
else if ( assignedValue instanceof SelectStatement ) {
12071207
char separator = OPEN_PARENTHESIS;
12081208
for ( ColumnReference columnReference : columnReferences ) {
12091209
appendSql( separator );
12101210
columnReference.appendColumnForWrite( this, null );
12111211
separator = COMMA_SEPARATOR_CHAR;
12121212
}
12131213
appendSql( ")=" );
1214-
assignment.getAssignedValue().accept( this );
1214+
assignedValue.accept( this );
1215+
}
1216+
else {
1217+
assert assignedValue instanceof SqlTupleContainer;
1218+
final List<? extends Expression> expressions = ( (SqlTupleContainer) assignedValue ).getSqlTuple().getExpressions();
1219+
columnReferences.get( 0 ).appendColumnForWrite( this, null );
1220+
appendSql( '=' );
1221+
expressions.get( 0 ).accept( this );
1222+
for ( int i = 1; i < columnReferences.size(); i++ ) {
1223+
appendSql( ',' );
1224+
columnReferences.get( i ).appendColumnForWrite( this, null );
1225+
appendSql( '=' );
1226+
expressions.get( i ).accept( this );
1227+
}
12151228
}
12161229
}
12171230

@@ -2104,17 +2117,39 @@ private void renderPredicatedSetAssignments(List<Assignment> assignments, Predic
21042117
visitSetAssignment( assignment );
21052118
}
21062119
else {
2107-
assert assignment.getAssignable().getColumnReferences().size() == 1;
2108-
final Expression expression = new CaseSearchedExpression(
2109-
(MappingModelExpressible) assignment.getAssignedValue().getExpressionType(),
2110-
List.of(
2111-
new CaseSearchedExpression.WhenFragment(
2112-
predicate, assignment.getAssignedValue()
2120+
final Assignable assignable = assignment.getAssignable();
2121+
final Expression assignedValue = assignment.getAssignedValue();
2122+
final Expression expression;
2123+
if ( assignable.getColumnReferences().size() == 1 ) {
2124+
expression = new CaseSearchedExpression(
2125+
(MappingModelExpressible) assignedValue.getExpressionType(),
2126+
List.of( new CaseSearchedExpression.WhenFragment( predicate, assignedValue ) ),
2127+
assignable.getColumnReferences().get( 0 )
2128+
);
2129+
}
2130+
else {
2131+
assert assignedValue instanceof SqlTupleContainer;
2132+
final List<? extends Expression> expressions =
2133+
( (SqlTupleContainer) assignedValue ).getSqlTuple().getExpressions();
2134+
final List<Expression> tupleExpressions = new ArrayList<>( expressions.size() );
2135+
for ( int i = 0; i < expressions.size(); i++ ) {
2136+
tupleExpressions.add(
2137+
new CaseSearchedExpression(
2138+
(MappingModelExpressible) expressions.get( i ).getExpressionType(),
2139+
List.of( new CaseSearchedExpression.WhenFragment(
2140+
predicate,
2141+
expressions.get( i )
2142+
) ),
2143+
assignable.getColumnReferences().get( i )
21132144
)
2114-
),
2115-
assignment.getAssignable().getColumnReferences().get( 0 )
2116-
);
2117-
visitSetAssignment( new Assignment( assignment.getAssignable(), expression ) );
2145+
);
2146+
}
2147+
expression = new SqlTuple(
2148+
tupleExpressions,
2149+
(MappingModelExpressible) assignedValue.getExpressionType()
2150+
);
2151+
}
2152+
visitSetAssignment( new Assignment( assignable, expression ) );
21182153
}
21192154
}
21202155
}

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

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*/
55
package org.hibernate.orm.test.flush;
66

7-
import org.hibernate.testing.jdbc.SQLStatementInspector;
87
import org.hibernate.testing.orm.junit.DomainModel;
98
import org.hibernate.testing.orm.junit.SessionFactory;
109
import org.hibernate.testing.orm.junit.SessionFactoryScope;
@@ -26,9 +25,7 @@
2625
AutoFlushOnUpdateQueryTest.Fruit.class,
2726
}
2827
)
29-
@SessionFactory(
30-
statementInspectorClass = SQLStatementInspector.class
31-
)
28+
@SessionFactory
3229
public class AutoFlushOnUpdateQueryTest {
3330

3431
public static final String FRUIT_NAME = "Apple";
@@ -54,8 +51,6 @@ public void tearDown(SessionFactoryScope scope) {
5451

5552
@Test
5653
public void testFlushIsExecuted(SessionFactoryScope scope) {
57-
SQLStatementInspector statementInspector = scope.getStatementInspector( SQLStatementInspector.class );
58-
statementInspector.clear();
5954
scope.inTransaction(
6055
session -> {
6156
Fruit fruit = session
@@ -85,6 +80,37 @@ public void testFlushIsExecuted(SessionFactoryScope scope) {
8580
);
8681
}
8782

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+
88114
@Entity(name = "Fruit")
89115
public static class Fruit {
90116

0 commit comments

Comments
 (0)