|
31 | 31 | import org.hibernate.engine.spi.PersistentAttributeInterceptor;
|
32 | 32 | import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper;
|
33 | 33 | import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform;
|
| 34 | +import org.hibernate.generator.BeforeExecutionGenerator; |
| 35 | +import org.hibernate.generator.Generator; |
34 | 36 | import org.hibernate.graph.GraphSemantic;
|
35 | 37 | import org.hibernate.graph.spi.RootGraphImplementor;
|
36 | 38 | import org.hibernate.loader.ast.spi.CascadingFetchProfile;
|
37 | 39 | import org.hibernate.persister.collection.CollectionPersister;
|
38 | 40 | import org.hibernate.persister.entity.EntityPersister;
|
39 | 41 | import org.hibernate.proxy.LazyInitializer;
|
40 |
| -import org.hibernate.generator.Generator; |
41 |
| -import org.hibernate.generator.BeforeExecutionGenerator; |
42 | 42 | import org.hibernate.tuple.entity.EntityMetamodel;
|
43 | 43 |
|
44 | 44 | import jakarta.transaction.SystemException;
|
@@ -173,37 +173,50 @@ public void update(String entityName, Object entity) {
|
173 | 173 | public void upsert(String entityName, Object entity) {
|
174 | 174 | checkOpen();
|
175 | 175 | final EntityPersister persister = getEntityPersister( entityName, entity );
|
176 |
| - Object id = persister.getIdentifier( entity, this ); |
177 |
| - Boolean knownTransient = persister.isTransient( entity, this ); |
178 |
| - if ( knownTransient!=null && knownTransient ) { |
179 |
| - throw new TransientObjectException( |
180 |
| - "Object passed to upsert() has a null identifier: " |
181 |
| - + persister.getEntityName() ); |
182 |
| -// final Generator generator = persister.getGenerator(); |
183 |
| -// if ( !generator.generatedOnExecution() ) { |
184 |
| -// id = ( (BeforeExecutionGenerator) generator).generate( this, entity, null, INSERT ); |
185 |
| -// } |
186 |
| - } |
| 176 | + final Object id = idToUpsert( entity, persister ); |
187 | 177 | final Object[] state = persister.getValues( entity );
|
188 |
| - final Object oldVersion; |
| 178 | + final Object oldVersion = versionToUpsert( entity, persister, state ); |
| 179 | + persister.merge( id, state, null, false, null, oldVersion, entity, null, this ); |
| 180 | + } |
| 181 | + |
| 182 | + private Object versionToUpsert(Object entity, EntityPersister persister, Object[] state) { |
189 | 183 | if ( persister.isVersioned() ) {
|
190 |
| - oldVersion = persister.getVersion( entity ); |
191 |
| - if ( oldVersion == null ) { |
| 184 | + final Object oldVersion = persister.getVersion( entity ); |
| 185 | + final Boolean knownTransient = |
| 186 | + persister.getVersionMapping() |
| 187 | + .getUnsavedStrategy() |
| 188 | + .isUnsaved( oldVersion ); |
| 189 | + if ( knownTransient != null && knownTransient ) { |
192 | 190 | if ( seedVersion( entity, state, persister, this ) ) {
|
193 | 191 | persister.setValues( entity, state );
|
194 | 192 | }
|
| 193 | + // this is a nonsense but avoids setting version restriction |
| 194 | + // parameter to null later on deep in the guts |
| 195 | + return state[persister.getVersionProperty()]; |
195 | 196 | }
|
196 | 197 | else {
|
197 | 198 | final Object newVersion = incrementVersion( entity, oldVersion, persister, this );
|
198 | 199 | setVersion( state, newVersion, persister );
|
199 | 200 | persister.setValues( entity, state );
|
| 201 | + return oldVersion; |
200 | 202 | }
|
201 | 203 | }
|
202 | 204 | else {
|
203 |
| - oldVersion = null; |
| 205 | + return null; |
204 | 206 | }
|
205 |
| - persister.merge( id, state, null, false, null, oldVersion, entity, null, this ); |
206 |
| -// persister.setIdentifier( entity, id, this ); |
| 207 | + } |
| 208 | + |
| 209 | + private Object idToUpsert(Object entity, EntityPersister persister) { |
| 210 | + final Object id = persister.getIdentifier( entity, this ); |
| 211 | + final Boolean unsaved = |
| 212 | + persister.getIdentifierMapping() |
| 213 | + .getUnsavedStrategy() |
| 214 | + .isUnsaved( id ); |
| 215 | + if ( unsaved != null && unsaved ) { |
| 216 | + throw new TransientObjectException( "Object passed to upsert() has an unsaved identifier value: " |
| 217 | + + persister.getEntityName() ); |
| 218 | + } |
| 219 | + return id; |
207 | 220 | }
|
208 | 221 |
|
209 | 222 |
|
|
0 commit comments