MauroDataMapper / mdm-core

The backend of MDM
Apache License 2.0
6 stars 3 forks source link

NonUniqueObjectException when creating a new version of a finalized Versioned Folder #410

Open pringinacio opened 1 year ago

pringinacio commented 1 year ago

Description

When creating a new version of a finalized Versioned Folder (Create a New version -> New Version on the UI) , a NonUniqueObjectException occurs. This does not occur on all finalized versioned folder, but as soon as it starts occurring, the solution is to delete all failing folders. And start all over.

Steps to reproduce

e.g.

  1. Go to 'Create a New version' on a Versioned Folder
  2. Choose 'New Version' on the drop-down box.
  3. Click on 'Create'
  4. See error

Expected behavior

A new "main" version of the folder is created.

Screenshots

image

image

image

Environment

Additional context

The stacktrace:

Server Error

We're sorry, but the server responded with an error message.

Details

{
  "headers": {
    "normalizedNames": {},
    "lazyUpdate": null
  },
  "status": 500,
  "statusText": "OK",
  "url": "https://xxx/api/versionedFolders/72adfc08-9178-47e3-ae42-1a983ad468fb/newBranchModelVersion",
  "ok": false,
  "name": "HttpErrorResponse",
  "message": "Http failure response for https://xxx/api/versionedFolders/72adfc08-9178-47e3-ae42-1a983ad468fb/newBranchModelVersion: 500 OK",
  "error": {
    "status": 500,
    "reason": "Internal Server Error",
    "errorCode": "UEX--",
    "message": "A different object with the same identifier value was already associated with the session : [uk.ac.ox.softeng.maurodatamapper.datamodel.item.DataClass#fc5f4231-1c52-4fb2-afcb-1d673de56c9c]",
    "path": "/api/versionedFolders/72adfc08-9178-47e3-ae42-1a983ad468fb/newBranchModelVersion",
    "version": "5.2.0",
    "exception": {
      "type": "NonUniqueObjectException",
      "message": "A different object with the same identifier value was already associated with the session : [uk.ac.ox.softeng.maurodatamapper.datamodel.item.DataClass#fc5f4231-1c52-4fb2-afcb-1d673de56c9c]",
      "stacktrace": [
        "org.hibernate.engine.internal.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:696)",
        "org.hibernate.event.internal.AbstractReassociateEventListener.reassociate(AbstractReassociateEventListener.java:59)",
        "org.hibernate.event.internal.DefaultLockEventListener.onLock(DefaultLockEventListener.java:79)",
        "org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107)",
        "org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:727)",
        "org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:721)",
        "org.hibernate.internal.SessionImpl.access$1100(SessionImpl.java:202)",
        "org.hibernate.internal.SessionImpl$LockRequestImpl.lock(SessionImpl.java:2661)",
        "org.grails.orm.hibernate.GrailsHibernateTemplate.lambda$lock$8(GrailsHibernateTemplate.java:417)",
        "org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:297)",
        "org.grails.orm.hibernate.GrailsHibernateTemplate.lock(GrailsHibernateTemplate.java:416)",
        "org.grails.orm.hibernate.AbstractHibernateGormInstanceApi.attach(AbstractHibernateGormInstanceApi.groovy:236)",
        "org.grails.datastore.gorm.GormEntity$Trait$Helper.attach(GormEntity.groovy:168)",
        "org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor.intercept(ByteBuddyInterceptor.java:56)",
        "org.hibernate.proxy.ProxyConfiguration$InterceptorDispatcher.intercept(ProxyConfiguration.java:95)",
        "uk.ac.ox.softeng.maurodatamapper.datamodel.item.DataClassService$__tt__updateImportedElements_closure132$_closure159.doCall(DataClassService.groovy:323)",
        "uk.ac.ox.softeng.maurodatamapper.datamodel.item.DataClassService$__tt__updateImportedElements_closure132.doCall(DataClassService.groovy:322)",
        "uk.ac.ox.softeng.maurodatamapper.datamodel.item.DataClassService.$tt__updateImportedElements(DataClassService.groovy:320)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.datamodel.item.DataClassService.$tt__dataClassService_batchSave(DataClassService.groovy:312)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.datamodel.item.DataClassService.$tt__dataClassService_saveAll(DataClassService.groovy:298)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.model.ModelItemService.saveAll(ModelItemService.groovy:77)",
        "uk.ac.ox.softeng.maurodatamapper.core.model.ModelItemService.saveAll(ModelItemService.groovy:69)",
        "uk.ac.ox.softeng.maurodatamapper.datamodel.DataModelService.$tt__saveContent(DataModelService.groovy:438)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.datamodel.DataModelService.saveContent(DataModelService.groovy:395)",
        "uk.ac.ox.softeng.maurodatamapper.datamodel.DataModelService.$tt__saveModelWithContent(DataModelService.groovy:346)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.datamodel.DataModelService.$tt__dataModelService_saveModelWithContent(DataModelService.groovy:281)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.FolderService$__tt__copyModelsInFolder_closure65$_closure75.doCall(FolderService.groovy:483)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.FolderService$__tt__copyModelsInFolder_closure65.doCall(FolderService.groovy:467)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.FolderService.$tt__copyModelsInFolder(FolderService.groovy:458)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.FolderService.$tt__copyFolderContents(FolderService.groovy:430)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.FolderService.$tt__copyFolderPass(FolderService.groovy:387)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.FolderService.$tt__copyFolder(FolderService.groovy:340)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.VersionedFolderService.$tt__copyVersionedFolder(VersionedFolderService.groovy:607)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.VersionedFolderService.$tt__copyFolderAsNewBranchFolder(VersionedFolderService.groovy:583)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.VersionedFolderService.$tt__createNewBranchModelVersion(VersionedFolderService.groovy:485)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.VersionedFolderController.$tt__newBranchModelVersion(VersionedFolderController.groovy:192)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "org.grails.core.DefaultGrailsControllerClass$MethodHandleInvoker.invoke(DefaultGrailsControllerClass.java:223)",
        "org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)",
        "org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)",
        "org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)",
        "org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)",
        "org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)",
        "org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:920)",
        "org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)",
        "org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)",
        "org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)",
        "org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:126)",
        "org.springframework.boot.web.servlet.support.ErrorPageFilter.access$000(ErrorPageFilter.java:64)",
        "org.springframework.boot.web.servlet.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:101)",
        "org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:119)"
      ]
    }
  }
}
jamesrwelch commented 1 year ago

Thanks @pringinacio - we'll look into this and squash it!

jamesrwelch commented 1 year ago

@pringinacio From the looks of the stack trace, you're using the 'import' feature to include data classes from somewhere else - are these from within the same versioned folder, or imported from an entirely separate model (we should be handling both, but just trying to recreate locally)

pringinacio commented 1 year ago

There are two Versioned Folders (A and B). B does not depend on any other Versioned Folder. A references elements (Use Data Element(s) of...) and data classes (Use Data Class(s) from...) of B.

Both are imported from other place. When importing B no fixes are needed. When importing A it is necessary to redo all external references to B (https://github.com/MauroDataMapper/mdm-core/issues/242). Although the 242 issue is resolved, the models where created before the issue was fixed, so not sure if this is impacting the current behaviour. I will perform some new tests to check if the issue #242 still continues or not.

jamesrwelch commented 1 year ago

Thank you - this is very helpful - we'll take a look

pringinacio commented 1 year ago

@jamesrwelch I confirm that #242 problem continues to exist.

jamesrwelch commented 1 year ago

Thanks for this. #242 definitely working with our existing use cases, but that's where imports are from within the same versioned folder. I'll do some more testing as I fix this issue 👍