В разделе приведены сведения для диагностики и устранения проблемы. Рекомендации следует применять с учетом версии IDE, проекта и используемых компонентов ТЕЗИС.
Проблема описана в TS-17127
Возникает если расширяются (@Extends) сущности, экземпляры которых вставляются с помощью sql скриптов, выполняемых при инитах деплоеров.
Например, если расширить сущность df$Organisation. В проекте расширении будут добавлены update DB (или init DB - без разницы, на самом деле) скрипты, добавляющие столбцы в таблицу, в том числе и дискриминатор (при необходимости), и изменяющие записи в этой таблицы - установка значения дискриминатора (если мы используем аннотацию @Extends - автоматом добавится, если нет - придется руками делать).
При старте системы мы получим:
- Создаем новую БД
- Опционально выполняются update скрипты (если перед этим создали базу только на основе кубинских и тезисных init скриптов), обновляющие сущности организации.
- И только после этого будет выполнен
DocFlowDeployer.initDefault(), в рамках которого выполнится01-10-initDefaultDocflow.sql, где вставится строка для “Наша организация” в DF_ORGANIZATION, но со значением дискриминатора - null. И логично, что в этой строке дискриминатор не будет обновлен, так как соответсвующий скрипт выполнился на предыдущих шагах.
В результате, если попытаемся сохранить сущность (например, df$SimpleDoc), в поле “организация” которого будет установлена “Наша организация”, получим IllegalStateException:
java.lang.IllegalStateException: An attempt to save an entity with reference to some not persisted entity. All newly created entities must be saved in the same transaction. Put all these objects to the CommitContext before commit.
...
Suppressed: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: com.company.thesis2.entity.ExtOrganization-a851beaf-6890-4ab2-b847-b7a810c4c2b9 [detached].
Проблема возникнет при расширении сущностей:
- DocKind
- Organization
Однако для следующих сущностей, так как они используют стратегию наследования SINGLE_TABLE, не должно возникнуть проблем:
- TypicalResolution
- Numerator
- DocReceivingMethod
- OfficeFileNomenclature
- OfficeFile
- UserRole
- ProjectGroup
Решение
Пока не исправлен тикет, можно руками в проекте добавить скрипт в папку core/init/<dbmsType>/ где будет выполняться обновление дискриминаторов подобных сущностей. ExtDeployer, который создается студией для каждого проекта, в методе init() (ну или при первом ините, то есть при старте системы первый раз) выполнит скрипты, содержащие в имени строку init.
В элементах выбора сущностей (Lookup, PeakerField), а так же в столбцах таблицы, расширенная сущность отображается в формате <Имя класса сущности>-<UUID>
Это поведение связано с отсутсвием @NamePattern у сущности. Либо, если речь идет о нескольких уровнях расширения, платформа не всегда может определеить шаблон из родительской сущности. Например, TS-17141.
Решение
Добавить аннотацию @NamePattern для сущности. При этом следует учитывать следующий пункт.
Проблема указания NamePattern в расширенных сущностях
При переопределении @NamePattern родительской сущности, и использовании в нем атрибутов расширенной сущности, будут возникать ошибки в кейсах, где выбор сущности осуществялется по типу родительской сущности. Так как они попросту отсутствуют в родительской сущности, то не будут извлечены, что приведет к ошибкам при формировании строкового представления сущности.
Отсюда простое правило - в аннотации @NamePattern использовать только атрибуты первого предка в иерархии наследования, имеющего такую аннотацию.
Расширение сущности “Задача”. Копирование добавленных атрибутов из\в шаблоны не работает
Для начала, следует понимать, что шаблон задачи представлен отдельной сущностью TaskPattern (так исторически сложилось), а не той же сущностью Task (как с документами).
Таким образом, при добавлении атрибутов в сущность Task, нужно добавить абсолютно идентичные атрибуты в сущность TaskPattern.
Далее, при копировании задачи из шаблона и наоборот, ряд кейсов не работает. Эта ситуация описана в TS-17119.
Решение
Пока тикет не закрыт:
- Для того, чтобы в эдиторе задачи, по нажатию кнопки “Заполнить по шаблону”, значения добавленных атрибутов заполнялось значениями из шаблона, нужно:
- Если атрибут - datatype и отображается в эдиторе, то нужно переопределить метод
TaskEditor#getFieldsToCopyи добавить его имя в возвращаемый список. - В других случаях, нужно переопределеить метод
TaskEditor#fillTaskи руками добавить логику копирования значений из шаблона (параметр метода -taskPattern) в задачу (атрибутtaskItem).
- Если атрибут - datatype и отображается в эдиторе, то нужно переопределить метод
- Нужно расширить бин
com.haulmont.thesis.core.app.TaskWorkerBeanи переопределить в нем метод#createTaskPattern(com.haulmont.thesis.core.entity.AbstractTask, boolean, boolean). В этом методе нужно добавить логику инициализации значений добавленных в сущность атрибутов. Этот бин используется:- в списке задач, кнопка “Сохранить как шаблон”
- в списке шаблонов, кнопка “Создать” → “Копировать”
БД скрипты для сущности из дополнительного источника данных не генерируются, или генерируются в основном источнике
Проблема связана с тем, что сущность регистрируется в persistence.xml основного источника, а не дополнительного.
Ошибка исправлена в 3-й версии плагина.
Решение для ранней версии плагина
Перед тем как генерировать БД скрипты перенесите тэг class с классом нужной вам сущности из persistence.xml основного источника, в аналогичный конфиг для дополнительного источника данных этой сущности.
Не стартует ТЕЗИС если расширить сущность из дополнительного источника данных
Например, если расширить сущность FamilyStatus (Семейное положение), при старте ТЕЗИС получим ошибку:
13:31:58.775 ERROR c.h.c.c.s.AbstractWebAppContextLoader - Error initializing application
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodValidationPostProcessor' defined in class path resource [com/haulmont/cuba/spring.xml]: Cannot resolve reference to bean 'cuba_BeanValidation' while setting bean property 'beanValidation'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cuba_BeanValidation': Unsatisfied dependency expressed through field 'messages'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cuba_Messages': Unsatisfied dependency expressed through field 'messageTools'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cuba_MessageTools': Unsatisfied dependency expressed through field 'metadata'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cuba_Metadata': Unsatisfied dependency expressed through field 'tools'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cuba_MetadataTools': Unsatisfied dependency expressed through field 'dynamicAttributesTools'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cuba_DynamicAttributesTools': Unsatisfied dependency expressed through field 'dynamicAttributes'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cuba_DynamicAttributesService': Unsatisfied dependency expressed through field 'dynamicAttributesManagerAPI'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cuba_DynamicAttributesManager': Unsatisfied dependency expressed through field 'persistence'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cuba_Persistence': Unsatisfied dependency expressed through field 'transactions'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cuba_Transactions': Unsatisfied dependency expressed through field 'transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [com/haulmont/cuba/spring.xml]: Cannot resolve reference to bean 'entityManagerFactory' while setting bean property 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/haulmont/cuba/spring.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.7.3.19-cuba): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [thesis13] failed.
Internal Exception: Exception [EclipseLink-7250] (Eclipse Persistence Services - 2.7.3.19-cuba): org.eclipse.persistence.exceptions.ValidationException
Exception Description: [class com.haulmont.thesis.core.entity.hr.personal.PersonalData] uses a non-entity [class com.company.thesis13.entity.ExtFamilyStatus] as target entity in the relationship attribute [field familyStatus].
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:342) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1707) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1452) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) ~[spring-beans-5.3.23.jar:5.3.23]
at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:258) ~[spring-context-5.3.23.jar:5.3.23]
at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:762) ~[spring-context-5.3.23.jar:5.3.23]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:567) ~[spring-context-5.3.23.jar:5.3.23]
at org.springframework.context.support.AbstractRefreshableConfigApplicationContext.afterPropertiesSet(AbstractRefreshableConfigApplicationContext.java:154) ~[spring-context-5.3.23.jar:5.3.23]
at com.haulmont.cuba.core.sys.CubaClassPathXmlApplicationContext.<init>(CubaClassPathXmlApplicationContext.java:42) ~[cuba-global-7.2-thesis-5.2.2.jar:7.2-thesis-5.2.2]
at com.haulmont.cuba.core.sys.CubaCoreApplicationContext.<init>(CubaCoreApplicationContext.java:32) ~[cuba-core-7.2-thesis-5.2.2.jar:7.2-thesis-5.2.2]
at com.haulmont.cuba.core.sys.AppContextLoader.createApplicationContext(AppContextLoader.java:125) ~[cuba-core-7.2-thesis-5.2.2.jar:7.2-thesis-5.2.2]
at com.haulmont.cuba.core.sys.AppContextLoader.createApplicationContext(AppContextLoader.java:43) ~[cuba-core-7.2-thesis-5.2.2.jar:7.2-thesis-5.2.2]
at com.haulmont.cuba.core.sys.AbstractAppContextLoader.initAppContext(AbstractAppContextLoader.java:65) ~[cuba-global-7.2-thesis-5.2.2.jar:7.2-thesis-5.2.2]
at com.haulmont.thesis.core.sys.ThesisAppContextLoader.initAppContext(ThesisAppContextLoader.java:114) ~[thesis-core-5.2.3.jar:na]
at com.haulmont.cuba.core.sys.AbstractWebAppContextLoader.contextInitialized(AbstractWebAppContextLoader.java:86) ~[cuba-global-7.2-thesis-5.2.2.jar:7.2-thesis-5.2.2]
at com.haulmont.cuba.core.sys.AppContextLoader.contextInitialized(AppContextLoader.java:52) ~[cuba-core-7.2-thesis-5.2.2.jar:7.2-thesis-5.2.2]
at com.haulmont.thesis.core.sys.ThesisAppContextLoader.contextInitialized(ThesisAppContextLoader.java:57) ~[thesis-core-5.2.3.jar:na]
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4716) ~[catalina.jar:9.0.40]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5177) ~[catalina.jar:9.0.40]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[catalina.jar:9.0.40]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717) ~[catalina.jar:9.0.40]
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690) ~[catalina.jar:9.0.40]
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:706) ~[catalina.jar:9.0.40]
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1133) ~[catalina.jar:9.0.40]
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1866) ~[catalina.jar:9.0.40]
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[na:na]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-util.jar:9.0.40]
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118) ~[na:na]
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1045) ~[catalina.jar:9.0.40]
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:429) ~[catalina.jar:9.0.40]
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1576) ~[catalina.jar:9.0.40]
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309) ~[catalina.jar:9.0.40]
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123) ~[catalina.jar:9.0.40]
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423) ~[catalina.jar:9.0.40]
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366) ~[catalina.jar:9.0.40]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:936) ~[catalina.jar:9.0.40]
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:843) ~[catalina.jar:9.0.40]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[catalina.jar:9.0.40]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) ~[catalina.jar:9.0.40]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) ~[catalina.jar:9.0.40]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-util.jar:9.0.40]
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) ~[na:na]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) ~[catalina.jar:9.0.40]
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) ~[catalina.jar:9.0.40]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[catalina.jar:9.0.40]
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421) ~[catalina.jar:9.0.40]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[catalina.jar:9.0.40]
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930) ~[catalina.jar:9.0.40]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[catalina.jar:9.0.40]
at org.apache.catalina.startup.Catalina.start(Catalina.java:772) ~[catalina.jar:9.0.40]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:342) ~[bootstrap.jar:9.0.40]
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473) ~[bootstrap.jar:9.0.40]
Решение
Ошибка исправлена в ТЕЗИС 5.2.4 (TS-17920).
Если обновление версии ТЕЗИС не возможно, обратитесь в тех. поддержку за описанием вариантов обхода этой проблемы.
Ошибка при сохранении сущности по связи ONE_TO_MANY
Если мы создали в студии некоторую сущность А и добавили атрибут - ONE_TO_MANY коллекцию сущностей В. В эдиторе сущности А добавляется таблица, отображающая коллекцию связанных сущностей В. Мы можем создать новую сущность В (кнопка Создать), однако при ее сохранении может возникнуть ошибка. Например, в расширенный документ добавили атрибут - ONE_TO_MANY коллекцию расширенных сотрудников:
Stacktrace
java.lang.IllegalStateException: An attempt to save an entity with reference to some not persisted entity. All newly created entities must be saved in the same transaction. Put all these objects to the CommitContext before commit.
at com.haulmont.cuba.core.sys.aop.CascadePersistExceptionAspect.changeCascadePersistMessage(CascadePersistExceptionAspect.java:38)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:626)
at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:66)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy1006.commit(Unknown Source)
at com.haulmont.cuba.core.app.DataManagerBean.commit(DataManagerBean.java:188)
at com.haulmont.cuba.core.app.DataServiceBean.commit(DataServiceBean.java:41)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
at com.haulmont.thesis.core.sys.ThesisServiceInterceptor.aroundInvoke(ThesisServiceInterceptor.java:31)
at jdk.internal.reflect.GeneratedMethodAccessor384.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:90)
at jdk.internal.reflect.GeneratedMethodAccessor385.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy453.commit(Unknown Source)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at com.haulmont.cuba.core.sys.remoting.LocalServiceInvokerImpl.invoke(LocalServiceInvokerImpl.java:94)
at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:159)
at com.sun.proxy.$Proxy31.commit(Unknown Source)
at com.haulmont.cuba.client.sys.DataManagerClientImpl.commit(DataManagerClientImpl.java:100)
at com.haulmont.cuba.gui.data.impl.GenericDataSupplier.commit(GenericDataSupplier.java:105)
at com.haulmont.cuba.gui.data.impl.DsContextImpl.commit(DsContextImpl.java:140)
at com.haulmont.cuba.gui.components.AbstractEditor.commitInternal(AbstractEditor.java:363)
at com.haulmont.cuba.gui.components.AbstractEditor.closeWithCommit(AbstractEditor.java:410)
at com.haulmont.cuba.gui.components.AbstractEditor.commitAndClose(AbstractEditor.java:426)
at com.haulmont.thesis.web.ui.employee.EmployeeEditor.commitAndClose(EmployeeEditor.java:361)
at com.haulmont.cuba.gui.components.AbstractEditor.lambda$initCommitActions$1(AbstractEditor.java:98)
at com.haulmont.bali.events.EventHub.publish(EventHub.java:170)
at com.haulmont.cuba.gui.components.actions.BaseAction.actionPerform(BaseAction.java:222)
at com.haulmont.cuba.web.gui.components.WebButton.buttonClicked(WebButton.java:67)
at com.haulmont.cuba.web.widgets.CubaButton.fireClick(CubaButton.java:76)
at com.vaadin.ui.Button$1.click(Button.java:57)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:153)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:115)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:431)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:396)
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:260)
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:82)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1580)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:425)
at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:329)
at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:215)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
at com.haulmont.thesis.web.proxy.ReverseProxyLoginManager.doFilter(ReverseProxyLoginManager.java:57)
at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
at com.haulmont.thesis.web.security.jespa.ThesisJespaLoginProvider.doFilter(ThesisJespaLoginProvider.java:73)
at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:93)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:880)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1601)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:829)
Suppressed: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: com.company.thesis5.entity.ExtEmployee-50e74f89-2c4a-073b-8dce-9298236d56f2 [new].
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.discoverUnregisteredNewObjects(RepeatableWriteUnitOfWork.java:315)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.calculateChanges(UnitOfWorkImpl.java:768)
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.writeChanges(RepeatableWriteUnitOfWork.java:443)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:974)
at com.haulmont.cuba.core.sys.persistence.PersistenceImplSupport$ContainerResourceSynchronization.detachAll(PersistenceImplSupport.java:504)
at com.haulmont.cuba.core.sys.persistence.PersistenceImplSupport$ContainerResourceSynchronization.beforeCommit(PersistenceImplSupport.java:450)
at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:96)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:919)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:727)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711)
at com.haulmont.cuba.core.sys.TransactionImpl.commit(TransactionImpl.java:104)
at com.haulmont.cuba.core.app.RdbmsStore.commit(RdbmsStore.java:561)
at com.haulmont.thesis.core.app.ThesisRdbmsStore.commit(ThesisRdbmsStore.java:130)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:62)
... 103 more
Эта ошибка возникает из-за следующих факторов. По умолчанию, для атрибутов - ONE_TO_MANY коллекций сущностей, студия использует Композицию, а в эдиторе, для этого атрибута создается (Nested) PropertyDatasource. В этом случае, платформа сама контролирует контекст датасурсов и при сохранении родительской сущности, сохраняет и сущности по связям. То есть, добавленная по композиции сущность сохраняется только вместе с родительской сущностью (когда сохраняется именно родительская сущность). Однако, если при сохранении сущности, связанной композицией, создаются другие сущности (связанные не композицией, но ассоциацией), то при их сохранении может возникнуть ошибка.
В приведенном примере, при создании сотрудника, также создаются MANY_TO_MANY сущности DepartmentPositionRelation, хранящие ссылку на сотрудника. В результате, не получается сохранить экземпляры этих сущностей, так как они содержат ссылку на не сохраненную сущность сотрудника, которая, в добавок, в контекст источника не попадает, так как она сохраняется при сохранении документа. Об этом и сообщает нам ошибка, чей стэктрейс мы привели ранее.
Возможное решение
Убрать аннотации @Composition и @OnDeleteCascade с ONE_TO_MANY атрибута.
JPQL запросы не различаются сущности в иерархии наследования SINGLE_TABLE
Простой пример, есть сущность A определяющая корень иерархии со стратегией наследования SINGLE_TABLE.
Есть 2 ее прямых потомка: B и C.
Проблема: в списочном экране в таблице должны отображаться сущности типа А (в запросе источника данных указана сущность этого типа). Но отображаются сущности обоих типов, и А и В.
Проблема была на уровне EclipseLink, и устранена в ТЕЗИС 5.3.1 (TS-18184).
Возможное решение без обновления ТЕЗИС
Для ТЕЗИС 5.2, можно просто повысить версию зависимости org.eclipse.persistence.jpa. Для этого, в блоке конфигурации всех модулей, укажите зависимость org.eclipse.persistence:org.eclipse.persistence.jpa:2.7.3-20-cuba:
configure([globalModule, coreModule, guiModule, webModule, portalModule, mobileRestModule]) {
apply(plugin: 'java')
apply(plugin: 'maven')
apply(plugin: 'cuba')
apply(plugin: 'groovy')
dependencies {
implementation('org.eclipse.persistence:org.eclipse.persistence.jpa:2.7.3-20-cuba')
}
//...