Jmix 3.0 release candidate

Hi everyone,

We are happy to announce that the release candidate of Jmix v.3.0 is published in our artifact repositories!

To use the RC, update Studio to v.3.0 from the nightly channel and select “Show unstable versions” when creating or upgrading a project.

For information on the new features, improvements, and upgrade instructions, please refer to the release notes. The documentation is currently work in progress.

We would greatly appreciate your feedback on the RC. If you encounter any issues, please let us know.

The final release 3.0 is expected by the end of June.

5 Likes

Changes to support MySQL 8.4 with Audit add-on seem to be working, thanks!

Found one issue so far. I use the Application Settings add-on, but not multi-tenant. However, it appears to be expecting a TENANT_ID column: My application settings table is named CENTRAL_OFFICE_SETTINGS.

2026-06-21T18:42:31.375-04:00  WARN 17712 --- [cat-handler-251] eclipselink.logging.all                  : Exception [EclipseLink-4002] (Eclipse Persistence Services - 5.0.0-1-jmix.v202605261051-e0fe8f1a176757fc63a9d1bb332ba974e10a6da0): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Unknown column 'TENANT_ID' in 'field list'
Error Code: 1054
Call: SELECT ID, ADMIN_ADDR1, ADMIN_ADDR2, ADMIN_CITY_STATE_ZIP, ADMIN_NAME, ADMIN_TITLE, BACKGROUND_SCREEN_EMAIL, BACKGROUND_SCREEN_NAME, BACKGROUND_SCREEN_TITLE, DBA_EMAIL, DBA_NAME, EMAIL_ADDRESS, EMAIL_NAME, EXAM_EMAIL, EXAM_NAME, EXAM_TITLE, INSURANCE_EMAIL, INSURANCE_NAME, ORG_NAME, ORG_NAME_SHORT, PHONE_NUMBER, REGIONS_EMAIL, REGIONS_NAME, TENANT_ID, VERSION, WEB_SITE, WEBMASTER_EMAIL, WEBMASTER_NAME FROM CENTRAL_OFFICE_SETTINGS WHERE (ID = ?)
	bind => [1]
Query: ReadObjectQuery(referenceClass=CentralOfficeSettings sql="SELECT ID, ADMIN_ADDR1, ADMIN_ADDR2, ADMIN_CITY_STATE_ZIP, ADMIN_NAME, ADMIN_TITLE, BACKGROUND_SCREEN_EMAIL, BACKGROUND_SCREEN_NAME, BACKGROUND_SCREEN_TITLE, DBA_EMAIL, DBA_NAME, EMAIL_ADDRESS, EMAIL_NAME, EXAM_EMAIL, EXAM_NAME, EXAM_TITLE, INSURANCE_EMAIL, INSURANCE_NAME, ORG_NAME, ORG_NAME_SHORT, PHONE_NUMBER, REGIONS_EMAIL, REGIONS_NAME, TENANT_ID, VERSION, WEB_SITE, WEBMASTER_EMAIL, WEBMASTER_NAME FROM CENTRAL_OFFICE_SETTINGS WHERE (ID = ?)")
2026-06-21T18:42:31.378-04:00 ERROR 17712 --- [cat-handler-251] i.j.f.e.DefaultUiExceptionHandler        : Unhandled exception

jakarta.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 5.0.0-1-jmix.v202605261051-e0fe8f1a176757fc63a9d1bb332ba974e10a6da0): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Unknown column 'TENANT_ID' in 'field list'
Error Code: 1054
Call: SELECT ID, ADMIN_ADDR1, ADMIN_ADDR2, ADMIN_CITY_STATE_ZIP, ADMIN_NAME, ADMIN_TITLE, BACKGROUND_SCREEN_EMAIL, BACKGROUND_SCREEN_NAME, BACKGROUND_SCREEN_TITLE, DBA_EMAIL, DBA_NAME, EMAIL_ADDRESS, EMAIL_NAME, EXAM_EMAIL, EXAM_NAME, EXAM_TITLE, INSURANCE_EMAIL, INSURANCE_NAME, ORG_NAME, ORG_NAME_SHORT, PHONE_NUMBER, REGIONS_EMAIL, REGIONS_NAME, TENANT_ID, VERSION, WEB_SITE, WEBMASTER_EMAIL, WEBMASTER_NAME FROM CENTRAL_OFFICE_SETTINGS WHERE (ID = ?)
	bind => [1]
Query: ReadObjectQuery(referenceClass=CentralOfficeSettings sql="SELECT ID, ADMIN_ADDR1, ADMIN_ADDR2, ADMIN_CITY_STATE_ZIP, ADMIN_NAME, ADMIN_TITLE, BACKGROUND_SCREEN_EMAIL, BACKGROUND_SCREEN_NAME, BACKGROUND_SCREEN_TITLE, DBA_EMAIL, DBA_NAME, EMAIL_ADDRESS, EMAIL_NAME, EXAM_EMAIL, EXAM_NAME, EXAM_TITLE, INSURANCE_EMAIL, INSURANCE_NAME, ORG_NAME, ORG_NAME_SHORT, PHONE_NUMBER, REGIONS_EMAIL, REGIONS_NAME, TENANT_ID, VERSION, WEB_SITE, WEBMASTER_EMAIL, WEBMASTER_NAME FROM CENTRAL_OFFICE_SETTINGS WHERE (ID = ?)")
	at org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedException(QueryImpl.java:391) ~[org.eclipse.persistence.jpa-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261052]
	at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:267) ~[org.eclipse.persistence.jpa-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261052]
	at org.eclipse.persistence.internal.jpa.QueryImpl.getSingleResult(QueryImpl.java:554) ~[org.eclipse.persistence.jpa-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261052]
	at org.eclipse.persistence.internal.jpa.QueryImpl.getSingleResult(QueryImpl.java:538) ~[org.eclipse.persistence.jpa-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261052]
	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getSingleResult(EJBQueryImpl.java:534) ~[org.eclipse.persistence.jpa-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261052]
	at io.jmix.eclipselink.impl.JmixEclipseLinkQuery.getResultFromCache(JmixEclipseLinkQuery.java:881) ~[jmix-eclipselink-3.0.0-RC1.jar:na]
	at io.jmix.eclipselink.impl.JmixEclipseLinkQuery.getSingleResult(JmixEclipseLinkQuery.java:161) ~[jmix-eclipselink-3.0.0-RC1.jar:na]
	at io.jmix.eclipselink.impl.JpaDataStore.executeQuery(JpaDataStore.java:691) ~[jmix-eclipselink-3.0.0-RC1.jar:na]
	at io.jmix.eclipselink.impl.JpaDataStore.loadOne(JpaDataStore.java:151) ~[jmix-eclipselink-3.0.0-RC1.jar:na]
	at io.jmix.core.datastore.AbstractDataStore.load(AbstractDataStore.java:87) ~[jmix-core-3.0.0-RC1.jar:na]
	at io.jmix.core.impl.UnconstrainedDataManagerImpl.lambda$load$0(UnconstrainedDataManagerImpl.java:108) ~[jmix-core-3.0.0-RC1.jar:na]
	at io.micrometer.observation.Observation.observe(Observation.java:634) ~[micrometer-observation-1.16.5.jar:1.16.5]
	at io.jmix.core.impl.UnconstrainedDataManagerImpl.load(UnconstrainedDataManagerImpl.java:108) ~[jmix-core-3.0.0-RC1.jar:na]
	at io.jmix.core.FluentLoader$ById.optional(FluentLoader.java:268) ~[jmix-core-3.0.0-RC1.jar:na]
	at io.jmix.appsettings.impl.AppSettingsToolsImpl.lambda$loadGlobalAppSettingsEntity$2(AppSettingsToolsImpl.java:224) ~[jmix-appsettings-3.0.0-RC1.jar:na]
	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137) ~[spring-tx-7.0.7.jar:7.0.7]
	at io.jmix.appsettings.impl.AppSettingsToolsImpl.loadGlobalAppSettingsEntity(AppSettingsToolsImpl.java:213) ~[jmix-appsettings-3.0.0-RC1.jar:na]
	at io.jmix.appsettings.impl.AppSettingsToolsImpl.loadAppSettingsEntityFromDataStore(AppSettingsToolsImpl.java:97) ~[jmix-appsettings-3.0.0-RC1.jar:na]
	at io.jmix.appsettings.AppSettingsTools.loadAppSettingsEntityFromDataStore(AppSettingsTools.java:42) ~[jmix-appsettings-3.0.0-RC1.jar:na]
	at io.jmix.appsettings.impl.AppSettingsImpl.getAppSettingsEntity(AppSettingsImpl.java:68) ~[jmix-appsettings-3.0.0-RC1.jar:na]
	at io.jmix.appsettings.impl.AppSettingsImpl.load(AppSettingsImpl.java:46) ~[jmix-appsettings-3.0.0-RC1.jar:na]
	at org.ajjf.membership.util.SettingsProvider.getCoSettings(SettingsProvider.java:20) ~[main/:na]
	at org.ajjf.membership.service.AboutService.getAboutInfo(AboutService.java:23) ~[main/:na]
	at org.ajjf.membership.view.main.MainView.onPrefButtonAboutItemClick(MainView.java:69) ~[main/:na]
	at io.jmix.flowui.kit.event.EventBus.fireEvent(EventBus.java:107) ~[jmix-flowui-kit-3.0.0-RC1.jar:na]
	at io.jmix.flowui.kit.component.dropdownbutton.AbstractDropdownButton$AbstractDropdownButtonItem.lambda$addClickListener$558c0459$1(AbstractDropdownButton.java:747) ~[jmix-flowui-kit-3.0.0-RC1.jar:na]
	at com.vaadin.flow.component.ComponentEventBus.fireEventForListener(ComponentEventBus.java:242) ~[flow-server-25.1.7.jar:25.1.7]
	at com.vaadin.flow.component.ComponentEventBus.handleDomEvent(ComponentEventBus.java:494) ~[flow-server-25.1.7.jar:25.1.7]
	at com.vaadin.flow.component.ComponentEventBus.lambda$addDomTrigger$dd1b7957$1(ComponentEventBus.java:301) ~[flow-server-25.1.7.jar:25.1.7]
	at com.vaadin.flow.internal.nodefeature.ElementListenerMap.lambda$fireEvent$2(ElementListenerMap.java:501) ~[flow-server-25.1.7.jar:25.1.7]
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) ~[na:na]
	at com.vaadin.flow.internal.nodefeature.ElementListenerMap.fireEvent(ElementListenerMap.java:501) ~[flow-server-25.1.7.jar:25.1.7]
	at com.vaadin.flow.server.communication.rpc.EventRpcHandler.handleNode(EventRpcHandler.java:62) ~[flow-server-25.1.7.jar:25.1.7]
	at com.vaadin.flow.server.communication.rpc.AbstractRpcInvocationHandler.handle(AbstractRpcInvocationHandler.java:80) ~[flow-server-25.1.7.jar:25.1.7]
	at com.vaadin.flow.server.communication.ServerRpcHandler.handleInvocationData(ServerRpcHandler.java:619) ~[flow-server-25.1.7.jar:25.1.7]
	at com.vaadin.flow.server.communication.ServerRpcHandler.lambda$handleInvocations$6(ServerRpcHandler.java:600) ~[flow-server-25.1.7.jar:25.1.7]
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) ~[na:na]
	at com.vaadin.flow.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:600) ~[flow-server-25.1.7.jar:25.1.7]
	at com.vaadin.flow.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:424) ~[flow-server-25.1.7.jar:25.1.7]
	at com.vaadin.flow.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:137) ~[flow-server-25.1.7.jar:25.1.7]
	at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:63) ~[flow-server-25.1.7.jar:25.1.7]
	at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1835) ~[flow-server-25.1.7.jar:25.1.7]
	at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:402) ~[flow-server-25.1.7.jar:25.1.7]
	at com.vaadin.flow.spring.SpringServlet.service(SpringServlet.java:106) ~[vaadin-spring-25.1.7.jar:na]
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:723) ~[jakarta.servlet-api-6.1.0.jar:6.1.0]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:513) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:333) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:262) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.springframework.web.servlet.mvc.ServletForwardingController.handleRequestInternal(ServletForwardingController.java:139) ~[spring-webmvc-7.0.7.jar:7.0.7]
	at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:177) ~[spring-webmvc-7.0.7.jar:7.0.7]
	at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:49) ~[spring-webmvc-7.0.7.jar:7.0.7]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-7.0.7.jar:7.0.7]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866) ~[spring-webmvc-7.0.7.jar:7.0.7]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1000) ~[spring-webmvc-7.0.7.jar:7.0.7]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:903) ~[spring-webmvc-7.0.7.jar:7.0.7]
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:653) ~[jakarta.servlet-api-6.1.0.jar:6.1.0]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874) ~[spring-webmvc-7.0.7.jar:7.0.7]
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:723) ~[jakarta.servlet-api-6.1.0.jar:6.1.0]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-11.0.22.jar:11.0.22]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at io.jmix.core.impl.metadata.MetadataGenerationFilter.doFilterInternal(MetadataGenerationFilter.java:45) ~[jmix-core-3.0.0-RC1.jar:na]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.7.jar:7.0.7]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at io.jmix.core.impl.logging.LogMdcFilter.doFilterInternal(LogMdcFilter.java:28) ~[jmix-core-3.0.0-RC1.jar:na]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.7.jar:7.0.7]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:235) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:376) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:132) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:86) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:115) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:106) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:181) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:153) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:131) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:245) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:239) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:96) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:118) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:385) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:237) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:195) ~[spring-security-web-7.0.5.jar:7.0.5]
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:317) ~[spring-security-config-7.0.5.jar:7.0.5]
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:355) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:272) ~[spring-web-7.0.7.jar:7.0.7]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.7.jar:7.0.7]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.7.jar:7.0.7]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199) ~[spring-web-7.0.7.jar:7.0.7]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.7.jar:7.0.7]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:685) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:1272) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1801) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-11.0.22.jar:11.0.22]
	at java.base/java.lang.VirtualThread.run(VirtualThread.java:329) ~[na:na]
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 5.0.0-1-jmix.v202605261051-e0fe8f1a176757fc63a9d1bb332ba974e10a6da0): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Unknown column 'TENANT_ID' in 'field list'
Error Code: 1054
Call: SELECT ID, ADMIN_ADDR1, ADMIN_ADDR2, ADMIN_CITY_STATE_ZIP, ADMIN_NAME, ADMIN_TITLE, BACKGROUND_SCREEN_EMAIL, BACKGROUND_SCREEN_NAME, BACKGROUND_SCREEN_TITLE, DBA_EMAIL, DBA_NAME, EMAIL_ADDRESS, EMAIL_NAME, EXAM_EMAIL, EXAM_NAME, EXAM_TITLE, INSURANCE_EMAIL, INSURANCE_NAME, ORG_NAME, ORG_NAME_SHORT, PHONE_NUMBER, REGIONS_EMAIL, REGIONS_NAME, TENANT_ID, VERSION, WEB_SITE, WEBMASTER_EMAIL, WEBMASTER_NAME FROM CENTRAL_OFFICE_SETTINGS WHERE (ID = ?)
	bind => [1]
Query: ReadObjectQuery(referenceClass=CentralOfficeSettings sql="SELECT ID, ADMIN_ADDR1, ADMIN_ADDR2, ADMIN_CITY_STATE_ZIP, ADMIN_NAME, ADMIN_TITLE, BACKGROUND_SCREEN_EMAIL, BACKGROUND_SCREEN_NAME, BACKGROUND_SCREEN_TITLE, DBA_EMAIL, DBA_NAME, EMAIL_ADDRESS, EMAIL_NAME, EXAM_EMAIL, EXAM_NAME, EXAM_TITLE, INSURANCE_EMAIL, INSURANCE_NAME, ORG_NAME, ORG_NAME_SHORT, PHONE_NUMBER, REGIONS_EMAIL, REGIONS_NAME, TENANT_ID, VERSION, WEB_SITE, WEBMASTER_EMAIL, WEBMASTER_NAME FROM CENTRAL_OFFICE_SETTINGS WHERE (ID = ?)")
	at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:344) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:723) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:570) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2081) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:611) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:281) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:267) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectOneRow(DatasourceCallQueryMechanism.java:814) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectOneRowFromTable(ExpressionQueryMechanism.java:3037) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectOneRow(ExpressionQueryMechanism.java:2990) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.queries.ReadObjectQuery.executeObjectLevelReadQuery(ReadObjectQuery.java:584) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1292) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:937) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1251) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.queries.ReadObjectQuery.execute(ReadObjectQuery.java:469) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1339) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:3056) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1876) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1858) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1823) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:265) ~[org.eclipse.persistence.jpa-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261052]
	... 147 common frames omitted
Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'TENANT_ID' in 'field list'
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:112) ~[mysql-connector-j-9.7.0.jar:9.7.0]
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:114) ~[mysql-connector-j-9.7.0.jar:9.7.0]
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:988) ~[mysql-connector-j-9.7.0.jar:9.7.0]
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1056) ~[mysql-connector-j-9.7.0.jar:9.7.0]
	at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-7.0.2.jar:na]
	at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-7.0.2.jar:na]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:1056) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:682) ~[org.eclipse.persistence.core-5.0.0-1-jmix.jar:5.0.0-1-jmix.v202605261051]
	... 166 common frames omitted


Thank you for trying out the RC!
We’ll check this issue with TENANT_ID.

After migrating, the IDE tries to show

https://docs.jmix.io/jmix/v3/whats-new/release-3.0.html#breaking-changes

which is missing.

Hi @chicojeff

Thanks for your report.

Version 3.0 implements multitenancy support in the Application Settings add-on: Support multitenancy in application settings · Issue #5144 · jmix-framework/jmix · GitHub.

The expected behavior is the creation of a TENANT_ID column in your application settings entity tables. Having a TENANT_ID column in entities, even if the multitenancy add-on is not installed, is an accepted pattern in Jmix applications.

The odd thing is that, for some reason, the generation of liquidbase scripts did not start the first time the application was launched after migrating to a RC. Try doing this manually using the following action on your data store in Jmix Tool window:

Also, could you please tell us the reproduction steps and the Jmix Studio version? This will help us figure out why the generation didn’t happen automatically.

Best regards,
Dmitriy

In my case, the liquibase was generated. But as we cannot use liquibase in a standard application with different versions at the clients, we will have to do this step manually too.

I think, an important point is to make a comment in the upgrade documentation about his new field which is required.

Right, this is expected and will be fixed in the final release.

My first upgrade to version 3.0 did lead to several errors which I did try to resolve with the Jmix AI. My impression is, that the AI does not know about Jmix 3.0; correct ?

Yes, it will be updated after the final release.

Will do.

Thank you for the quick reply. Here is my information:

  • IntelliJ 2026.1.3 on Windows
  • Jmix plugin 3.0.NIGHTLY1718-261 → 3
  • Jmix framework 3.0.0-RC1
  • No subscription

Steps from yesterday:

  • Updated Jmix plugin (restart IntelliJ)
  • Upgrade project to 3.0.0-RC1
  • After migration is done, shut down IntelliJ
  • Run ./gradlew clean vaadinCleanfrom terminal
  • Start IntelliJ
  • Run unit tests (forces build) - everything successful
  • Start application
  • Column renames for Audit add-on noted in log
  • When app is ready, log in and get TENANT_IDerror on operations that load settings

When I try to generate Liquibase Changelog, I get error “requires a subscription”

Is that the problem? No subscription = no migration for some parts?

If you don’t have a subscription, just create a changelog manually:

We’ll add this to the release notes, thanks for pointing out the problem.

Manually creating the changelog resolved the problem and allowed me to complete testing (successfully!) on the rest of our app.

2 Likes

I get this message

2026-06-26T10:08:15.522+02:00 WARN 68592 — [BioOffice 4.0] [in-dev-server-1] c.v.f.s.frontend.TaskUpdateThemeImport : The ‘lumoImports’ property detected in theme(s) ‘[Bio4]’ is no longer supported in Vaadin 25. All modules except ‘utility’ are now loaded automatically when extending Lumo theme. To load utility classes, add ‘@StyleSheet(Lumo.UTILITY_STYLESHEET)’ annotation to ‘AppShellConfigurator’ implementor.

from Bio4/theme.json

{
“parent”: “jmix-lumo”,
“lumoImports”: [
“typography”,
“color”,
“spacing”,
“badge”,
“utility”
]
}

a) what should I do ?

b) how to activate Aura ?

Looks like 3.0 is released on nexus.jmix.io ?

Unfortunatly, maven repositories get deleted again ;/

maven {
    url = 'https://repo.osgeo.org/repository/release'
}

If Jasper Reports are used, this has to be added

dependencies {    implementation 'net.sf.jasperreports:jasperreports:6.21.3'}

to avoid the missing package.

import net.sf.jasperreports.engine.JRParameter; // missing package.

These 2 things where fine in the RC1 candidate.

Hi, @f.zehnder!

The warning itself is harmless. You can do as suggested - remove lumoImports and add @StyleSheet(Lumo.UTILITY_STYLESHEET) to the main application class. The release 3.0 Studio does all this during migration.

To switch to Aura, I’d recommend reading the Vaadin migration doc since Vaadin 25 simplifies the theme/styling system to bring it closer to normal/native web development. But this means that you’ll have to:

  • Move theme files to META-INF/resources/
  • Adapt any custom styles to Aura, which means using different CSS variables at least
  • Replace all Lumo utility classes, as they do not exist in Aura.

Important note: Aura is a completely new theme, i.e., not just a visual difference. It is not compatible with Lumo and requires migration.

Regards,
Gleb

Yes the release is on the way.

Could you clarify this? Deleted when?

Yes, it’s now documented in breaking changes.

Unfortunatly, maven repositories get deleted again ;/

When migrating from 2.8.2 to 3.0.0 in the build.gradle repositories are removed.

When migrating from 2.8.2 to 3.0.0 in the build.gradle repositories are removed.

Hi Felix,

So far, we have not been able to reproduce this issue. During migration to Jmix 3.0, Studio does not modify project repositories automatically.

I can imagine one scenario in which repositories may appear to be changed. If your project uses global.repo.jmix.io as the main Jmix repository together with a custom repository, Studio will show this setup as Custom configuration in the Repository selection field of the Project Properties dialog, with the list of repositories displayed below it.

If you then change the repository selection to Jmix at nexus.jmix.io in order to perform the migration, the previous custom configuration (including your custom repositories) will be replaced by the selected predefined configuration.

Could this be what happened in your case?

If not, could you please provide a minimal sample project whose repository configuration is changed during migration to Jmix 3.0? This will help us reproduce the issue and investigate it further.