cuba-platform / cuba

CUBA Platform is a high level framework for enterprise applications development
https://www.cuba-platform.com
Apache License 2.0
1.34k stars 221 forks source link

Exception when persisting object referencing a detached soft-deleted entity #1529

Open alexbudarov opened 5 years ago

alexbudarov commented 5 years ago

Environment

Description of the bug or enhancement

See patch for refapp 6.8. persist-with-reference-to-soft-deleted.patch.txt

1) Create a Driver entity. Then delete it and load the soft-deleted instance so that it is detached. 2) Try to persist a DriverAllocation entity pointing to a soft-deleted driver.

You get an exception with a message which doesn't tell actual state of things:

org.springframework.dao.InvalidDataAccessApiUsageException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: com.haulmont.refapp.core.entity.ExtDriver-89bbdd4b-4db1-c67b-1265-fc2c1b45b1ad [detached].; nested exception is java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: com.haulmont.refapp.core.entity.ExtDriver-89bbdd4b-4db1-c67b-1265-fc2c1b45b1ad [detached].

    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:381)
    at org.springframework.orm.jpa.DefaultJpaDialect.translateExceptionIfPossible(DefaultJpaDialect.java:122)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
    at com.haulmont.cuba.core.sys.TransactionImpl.commit(TransactionImpl.java:104)
    at com.haulmont.cuba.core.sys.TransactionImpl.execute(TransactionImpl.java:93)
    at com.haulmont.cuba.core.sys.TransactionImpl.execute(TransactionImpl.java:86)
    at com.haulmont.cuba.core.sys.PersistenceImpl.runInTransaction(PersistenceImpl.java:103)
    at com.haulmont.refapp.core.SoftDeletionPersistTest.testPersistWithLinkToDeletedEntity(SoftDeletionPersistTest.java:88)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: com.haulmont.refapp.core.entity.ExtDriver-89bbdd4b-4db1-c67b-1265-fc2c1b45b1ad [detached].
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.discoverUnregisteredNewObjects(RepeatableWriteUnitOfWork.java:313)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.calculateChanges(UnitOfWorkImpl.java:728)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1521)
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:278)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1174)
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:134)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)
    ... 13 more

Example patch attached worked fine in 5.6.

Note that if you try to link DriverAllocation with managed soft-deleted Driver - it will work OK.

andreysubbotin commented 5 years ago

Relates to cuba-platform/cuba#669