Skip to content

Commit cc1dde8

Browse files
committed
HHH-16957 Embeddable cannot have only one @generated field
1 parent f34f7cf commit cc1dde8

21 files changed

+911
-105
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.generator;
8+
9+
public interface CompositeBeforeExecutionGenerator extends BeforeExecutionGenerator, CompositeGenerator {
10+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.generator;
8+
9+
public interface CompositeGenerator {
10+
Generator getGenerator(String propertyName);
11+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
6+
*/
7+
package org.hibernate.generator.internal;
8+
9+
import java.util.EnumSet;
10+
import java.util.Map;
11+
12+
import org.hibernate.dialect.Dialect;
13+
import org.hibernate.generator.CompositeGenerator;
14+
import org.hibernate.generator.EventType;
15+
import org.hibernate.generator.Generator;
16+
import org.hibernate.generator.OnExecutionGenerator;
17+
18+
public class OnExecutionCompositeGenerator implements OnExecutionGenerator, CompositeGenerator {
19+
20+
final Map<String, Generator> generators;
21+
final EnumSet<EventType> eventTypes;
22+
final boolean writePropertyValue;
23+
final boolean referenceColumnsInSql;
24+
final String[] referencedColumnValues;
25+
26+
public OnExecutionCompositeGenerator(
27+
Map<String, Generator> generators,
28+
EnumSet<EventType> eventTypes,
29+
boolean writePropertyValue,
30+
boolean referenceColumnsInSql, String[] referencedColumnValues) {
31+
this.generators = generators;
32+
this.eventTypes = eventTypes;
33+
this.writePropertyValue = writePropertyValue;
34+
this.referenceColumnsInSql = referenceColumnsInSql;
35+
this.referencedColumnValues = referencedColumnValues;
36+
}
37+
38+
@Override
39+
public EnumSet<EventType> getEventTypes() {
40+
return eventTypes;
41+
}
42+
43+
@Override
44+
public boolean referenceColumnsInSql(Dialect dialect) {
45+
return referenceColumnsInSql;
46+
}
47+
48+
@Override
49+
public boolean writePropertyValue() {
50+
return writePropertyValue;
51+
}
52+
53+
@Override
54+
public String[] getReferencedColumnValues(Dialect dialect) {
55+
return referencedColumnValues;
56+
}
57+
58+
@Override
59+
public boolean generatedOnExecution() {
60+
return true;
61+
}
62+
63+
@Override
64+
public Generator getGenerator(String propertyName) {
65+
return generators.get( propertyName );
66+
}
67+
}

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
import org.hibernate.spi.EntityIdentifierNavigablePath;
4949
import org.hibernate.spi.NavigablePath;
5050
import org.hibernate.sql.ast.SqlAstJoinType;
51-
import org.hibernate.sql.ast.internal.TableGroupJoinHelper;
5251
import org.hibernate.sql.ast.spi.AliasCollector;
5352
import org.hibernate.sql.ast.spi.FromClauseAccess;
5453
import org.hibernate.sql.ast.spi.SimpleFromClauseAccessImpl;

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractEmbeddableMapping.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.hibernate.engine.jdbc.spi.JdbcServices;
2424
import org.hibernate.engine.spi.CascadeStyle;
2525
import org.hibernate.engine.spi.SharedSessionContractImplementor;
26+
import org.hibernate.generator.Generator;
2627
import org.hibernate.internal.util.IndexedConsumer;
2728
import org.hibernate.internal.util.collections.CollectionHelper;
2829
import org.hibernate.mapping.Any;
@@ -268,6 +269,7 @@ protected boolean finishInitialization(
268269
ConcreteTableResolver concreteTableResolver,
269270
Consumer<AttributeMapping> attributeConsumer,
270271
SuccessfulCompletionCallback completionCallback,
272+
Generator generator,
271273
MappingModelCreationProcess creationProcess) {
272274
final TypeConfiguration typeConfiguration = creationProcess.getCreationContext().getTypeConfiguration();
273275
final JdbcServices jdbcServices = creationProcess.getCreationContext().getJdbcServices();
@@ -278,7 +280,6 @@ protected boolean finishInitialization(
278280

279281
int attributeIndex = 0;
280282
int columnPosition = 0;
281-
282283
for ( Property bootPropertyDescriptor : bootDescriptor.getProperties() ) {
283284
final Type subtype = subtypes[ attributeIndex ];
284285

@@ -373,6 +374,7 @@ protected boolean finishInitialization(
373374
value.isColumnUpdateable( 0 ),
374375
propertyAccess,
375376
compositeType.getCascadeStyle( attributeIndex ),
377+
generator,
376378
creationProcess
377379
);
378380

@@ -440,6 +442,7 @@ else if ( subtype instanceof CompositeType ) {
440442
subRootTableKeyColumnNames,
441443
propertyAccess,
442444
compositeType.getCascadeStyle( attributeIndex ),
445+
generator,
443446
creationProcess
444447
);
445448

@@ -473,6 +476,7 @@ else if ( subtype instanceof EntityType ) {
473476
(EntityType) subtype,
474477
representationStrategy.resolvePropertyAccess( bootPropertyDescriptor ),
475478
compositeType.getCascadeStyle( attributeIndex ),
479+
generator,
476480
creationProcess
477481
);
478482
columnPosition += bootPropertyDescriptor.getColumnSpan();

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractSingularAttributeMapping.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public abstract class AbstractSingularAttributeMapping
2323
implements SingularAttributeMapping {
2424

2525
private final PropertyAccess propertyAccess;
26+
private final Generator generator;
2627

2728
public AbstractSingularAttributeMapping(
2829
String name,
@@ -31,9 +32,11 @@ public AbstractSingularAttributeMapping(
3132
AttributeMetadata attributeMetadata,
3233
FetchOptions mappedFetchOptions,
3334
ManagedMappingType declaringType,
35+
Generator generator,
3436
PropertyAccess propertyAccess) {
3537
super( name, attributeMetadata, mappedFetchOptions, stateArrayPosition, fetchableIndex, declaringType );
3638
this.propertyAccess = propertyAccess;
39+
this.generator = generator;
3740
}
3841

3942
public AbstractSingularAttributeMapping(
@@ -44,9 +47,11 @@ public AbstractSingularAttributeMapping(
4447
FetchTiming fetchTiming,
4548
FetchStyle fetchStyle,
4649
ManagedMappingType declaringType,
50+
Generator generator,
4751
PropertyAccess propertyAccess) {
4852
super( name, attributeMetadata, fetchTiming, fetchStyle, stateArrayPosition, fetchableIndex, declaringType );
4953
this.propertyAccess = propertyAccess;
54+
this.generator = generator;
5055
}
5156

5257
/**
@@ -55,6 +60,7 @@ public AbstractSingularAttributeMapping(
5560
protected AbstractSingularAttributeMapping( AbstractSingularAttributeMapping original ) {
5661
super( original );
5762
this.propertyAccess = original.propertyAccess;
63+
this.generator = original.getGenerator();
5864
}
5965

6066
@Override
@@ -64,7 +70,7 @@ public PropertyAccess getPropertyAccess() {
6470

6571
@Override
6672
public Generator getGenerator() {
67-
return findContainingEntityMapping().getEntityPersister().getEntityMetamodel().getGenerators()[getStateArrayPosition()];
73+
return generator;
6874
}
6975

7076
}

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicAttributeMapping.java

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.hibernate.engine.FetchStyle;
1212
import org.hibernate.engine.FetchTiming;
1313
import org.hibernate.engine.spi.SharedSessionContractImplementor;
14+
import org.hibernate.generator.Generator;
1415
import org.hibernate.internal.util.IndexedConsumer;
1516
import org.hibernate.metamodel.mapping.AttributeMetadata;
1617
import org.hibernate.metamodel.mapping.BasicValuedModelPart;
@@ -43,7 +44,7 @@
4344
@SuppressWarnings("rawtypes")
4445
public class BasicAttributeMapping
4546
extends AbstractSingularAttributeMapping
46-
implements SingularAttributeMapping, BasicValuedModelPart {
47+
implements BasicValuedModelPart {
4748
private final NavigableRole navigableRole;
4849

4950
private final String tableExpression;
@@ -95,6 +96,65 @@ public BasicAttributeMapping(
9596
JdbcMapping jdbcMapping,
9697
ManagedMappingType declaringType,
9798
PropertyAccess propertyAccess) {
99+
this(
100+
attributeName,
101+
navigableRole,
102+
stateArrayPosition,
103+
fetchableIndex,
104+
attributeMetadata,
105+
mappedFetchTiming,
106+
mappedFetchStyle,
107+
tableExpression,
108+
mappedColumnExpression,
109+
selectablePath,
110+
isFormula,
111+
customReadExpression,
112+
customWriteExpression,
113+
columnDefinition,
114+
length,
115+
precision,
116+
scale,
117+
temporalPrecision,
118+
isLob,
119+
nullable,
120+
insertable,
121+
updateable,
122+
partitioned,
123+
jdbcMapping,
124+
declaringType,
125+
null,
126+
propertyAccess
127+
);
128+
}
129+
130+
public BasicAttributeMapping(
131+
String attributeName,
132+
NavigableRole navigableRole,
133+
int stateArrayPosition,
134+
int fetchableIndex,
135+
AttributeMetadata attributeMetadata,
136+
FetchTiming mappedFetchTiming,
137+
FetchStyle mappedFetchStyle,
138+
String tableExpression,
139+
String mappedColumnExpression,
140+
SelectablePath selectablePath,
141+
boolean isFormula,
142+
String customReadExpression,
143+
String customWriteExpression,
144+
String columnDefinition,
145+
Long length,
146+
Integer precision,
147+
Integer scale,
148+
Integer temporalPrecision,
149+
boolean isLob,
150+
boolean nullable,
151+
boolean insertable,
152+
boolean updateable,
153+
boolean partitioned,
154+
JdbcMapping jdbcMapping,
155+
ManagedMappingType declaringType,
156+
Generator generator,
157+
PropertyAccess propertyAccess) {
98158
super(
99159
attributeName,
100160
stateArrayPosition,
@@ -103,6 +163,7 @@ public BasicAttributeMapping(
103163
mappedFetchTiming,
104164
mappedFetchStyle,
105165
declaringType,
166+
generator,
106167
propertyAccess
107168
);
108169
this.navigableRole = navigableRole;

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatedAssociationAttributeMapping.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.hibernate.engine.FetchTiming;
1818
import org.hibernate.engine.spi.SessionFactoryImplementor;
1919
import org.hibernate.engine.spi.SharedSessionContractImplementor;
20+
import org.hibernate.generator.Generator;
2021
import org.hibernate.internal.util.IndexedConsumer;
2122
import org.hibernate.mapping.Any;
2223
import org.hibernate.mapping.Property;
@@ -79,6 +80,40 @@ public DiscriminatedAssociationAttributeMapping(
7980
AnyType anyType,
8081
Any bootValueMapping,
8182
MappingModelCreationProcess creationProcess) {
83+
this(
84+
attributeRole,
85+
baseAssociationJtd,
86+
declaringType,
87+
stateArrayPosition,
88+
fetchableIndex,
89+
attributeMetadata,
90+
fetchTiming,
91+
propertyAccess,
92+
bootProperty,
93+
anyType,
94+
bootValueMapping,
95+
declaringType.findContainingEntityMapping()
96+
.getEntityPersister()
97+
.getEntityMetamodel()
98+
.getGenerators()[stateArrayPosition],
99+
creationProcess
100+
);
101+
}
102+
103+
public DiscriminatedAssociationAttributeMapping(
104+
NavigableRole attributeRole,
105+
JavaType<?> baseAssociationJtd,
106+
ManagedMappingType declaringType,
107+
int stateArrayPosition,
108+
int fetchableIndex,
109+
AttributeMetadata attributeMetadata,
110+
FetchTiming fetchTiming,
111+
PropertyAccess propertyAccess,
112+
Property bootProperty,
113+
AnyType anyType,
114+
Any bootValueMapping,
115+
Generator generator,
116+
MappingModelCreationProcess creationProcess) {
82117
super(
83118
bootProperty.getName(),
84119
stateArrayPosition,
@@ -87,6 +122,7 @@ public DiscriminatedAssociationAttributeMapping(
87122
fetchTiming,
88123
FetchStyle.SELECT,
89124
declaringType,
125+
generator,
90126
propertyAccess
91127
);
92128
this.navigableRole = attributeRole;

0 commit comments

Comments
 (0)