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.
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:
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.