Class CreateAlteredTrackableRepositoryOverrideImpl
- All Implemented Interfaces:
CreateAlteredTrackableRepositoryOverride
Version
annotated field.
Under Hibernate 7 a duplicate create no longer reaches the database insert (the tracking-entity
interceptor detects the pre-existing row and marks the entity detached, so persist fails fast),
so assertNotAlreadyPersisted(Trackable) detects the existing row up front and raises the
DataIntegrityViolationException callers expect.
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected voidapplyLock(com.broadleafcommerce.data.tracking.core.Trackable managed) protected voidassertNotAlreadyPersisted(com.broadleafcommerce.data.tracking.core.Trackable entity) Enforces the create-once contract: aservice#create for a contextId that already exists must fail with aDataIntegrityViolationException.protected voiddetectVersionAttribute(com.broadleafcommerce.data.tracking.core.Trackable entity) protected <T> Optional<jakarta.persistence.metamodel.SingularAttribute<?,?>> findVersionAttribute(jakarta.persistence.metamodel.IdentifiableType<T> type, jakarta.persistence.metamodel.Metamodel metamodel) protected jakarta.persistence.EntityManagergetEm()protected <T> booleanisNew(T entity) protected voidreplenishRequiredFields(com.broadleafcommerce.data.tracking.core.Trackable entity) com.broadleafcommerce.data.tracking.core.Trackablesave(com.broadleafcommerce.data.tracking.core.Trackable entity, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Serves as override forJpaTrackableRepository.save(Trackable, ContextInfo)Iterable<com.broadleafcommerce.data.tracking.core.Trackable>saveAll(Iterable<com.broadleafcommerce.data.tracking.core.Trackable> entities, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Serves as override forJpaTrackableRepository.saveAll(Iterable, ContextInfo)protected voidsetTrackingContainer(com.broadleafcommerce.data.tracking.core.Trackable result)
-
Constructor Details
-
CreateAlteredTrackableRepositoryOverrideImpl
public CreateAlteredTrackableRepositoryOverrideImpl()
-
-
Method Details
-
save
@Transactional(transactionManager="billingTransactionManager") public com.broadleafcommerce.data.tracking.core.Trackable save(com.broadleafcommerce.data.tracking.core.Trackable entity, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Description copied from interface:CreateAlteredTrackableRepositoryOverrideServes as override forJpaTrackableRepository.save(Trackable, ContextInfo)- Specified by:
savein interfaceCreateAlteredTrackableRepositoryOverride
-
saveAll
@Transactional(transactionManager="billingTransactionManager") public Iterable<com.broadleafcommerce.data.tracking.core.Trackable> saveAll(Iterable<com.broadleafcommerce.data.tracking.core.Trackable> entities, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Description copied from interface:CreateAlteredTrackableRepositoryOverrideServes as override forJpaTrackableRepository.saveAll(Iterable, ContextInfo)- Specified by:
saveAllin interfaceCreateAlteredTrackableRepositoryOverride
-
assertNotAlreadyPersisted
protected void assertNotAlreadyPersisted(com.broadleafcommerce.data.tracking.core.Trackable entity) Enforces the create-once contract: aservice#create for a contextId that already exists must fail with aDataIntegrityViolationException.Historically that violation came straight from the database --
EntityManager.persist(java.lang.Object)issued an insert and the primary-key constraint rejected the duplicate. Under Hibernate 7 the insert is never reached: every tracked entity carries a tracking embeddable that injects its owner viaParent, which drives theTransientReferenceResolvingInterceptorto probe the database, find the existing row, and report the entity as detached -- so persist raises aPersistentObjectException("Detached entity passed to persist") that Spring surfaces as anInvalidDataAccessApiUsageExceptionrather than the integrity violation callers (e.g. the duplicate guard inDefaultPaymentProcessingService) are written to catch. We therefore detect the pre-existing row up front with the same crash-safe load-by-id the interceptor relies on and raise the expected exception ourselves. -
replenishRequiredFields
protected void replenishRequiredFields(com.broadleafcommerce.data.tracking.core.Trackable entity) -
detectVersionAttribute
protected void detectVersionAttribute(com.broadleafcommerce.data.tracking.core.Trackable entity) -
setTrackingContainer
protected void setTrackingContainer(com.broadleafcommerce.data.tracking.core.Trackable result) -
applyLock
protected void applyLock(com.broadleafcommerce.data.tracking.core.Trackable managed) -
isNew
protected <T> boolean isNew(T entity) -
findVersionAttribute
protected <T> Optional<jakarta.persistence.metamodel.SingularAttribute<?,?>> findVersionAttribute(jakarta.persistence.metamodel.IdentifiableType<T> type, jakarta.persistence.metamodel.Metamodel metamodel) -
getEm
protected jakarta.persistence.EntityManager getEm()
-