Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
pringinacio opened this issue Apr 13, 2023 · 6 comments
Labels
bug Something isn't working

Comments

@pringinacio
Copy link

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

  • UI 7.2.0
  • mdm-core Version 5.2.0

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)"
      ]
    }
  }
}
@pringinacio pringinacio added the bug Something isn't working label Apr 13, 2023
@jamesrwelch
Copy link
Contributor

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

@jamesrwelch
Copy link
Contributor

@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
Copy link
Author

pringinacio commented Apr 14, 2023

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 (#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
Copy link
Contributor

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

@pringinacio
Copy link
Author

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

@jamesrwelch
Copy link
Contributor

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 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants