Model Import does not work with embedded H2

Hey,
for local tests i want to start the DS spring boot app with model pre-loaded on start up.
I use the “dataservices-embedded_h2” as a temporary database.
However, the start-up fails when trying to save the provided models with the execption:

INFO  [main] c.m.a.d.i.BusinessModelInitializer: Importing business models: file:../../../erutdg-dist/src/main/resources/etc/a12ds/models
 WARN  [main] o.h.e.j.s.SqlExceptionHelper: SQL Error: 42102, SQLState: 42S02
 ERROR [main] o.h.e.j.s.SqlExceptionHelper: Tabelle "MODEL_FIELDS" nicht gefunden
  Table "MODEL_FIELDS" not found; SQL statement:
  insert into model_fields (data,field_name,field_type,model_name,id) values (?,?,?,?,default) [42102-224]
  2025-08-06 13:28:09,319 WARN  [main] c.m.a.d.m.b.ModelBulkImporter: could not prepare statement [Tabelle "MODEL_FIELDS" nicht gefunden
  Table "MODEL_FIELDS" not found; SQL statement:
  insert into model_fields (data,field_name,field_type,model_name,id) values (?,?,?,?,default) [42102-224]] [insert into model_fields (data,field_name,field_type,model_name,id) values (?,?,?,?,default)]; SQL [insert into model_fields (data,field_name,field_type,model_name,id) values (?,?,?,?,default)]
  org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement [Tabelle "MODEL_FIELDS" nicht gefunden
  Table "MODEL_FIELDS" not found; SQL statement:
  insert into model_fields (data,field_name,field_type,model_name,id) values (?,?,?,?,default) [42102-224]] [insert into model_fields (data,field_name,field_type,model_name,id) values (?,?,?,?,default)]; SQL [insert into model_fields (data,field_name,field_type,model_name,id) values (?,?,?,?,default)]
  	at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:281)
  	at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:256)
  	at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:241)
  	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:560)
  	at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
  	at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:343)
  	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:160)
  	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
  	at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165)
  	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
  	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223)
  	at jdk.proxy2/jdk.proxy2.$Proxy240.save(Unknown Source)
  	at com.mgmtp.a12.dataservices.query.indexing.internal.persistence.DocumentModelFieldsIndexer$1.visitField(DocumentModelFieldsIndexer.java:97)
  	at com.mgmtp.a12.kernel.md.model.api.visitor.DocumentModelWalker.visitElementInheritance(DocumentModelWalker.java:151)
  	at com.mgmtp.a12.kernel.md.model.api.visitor.DocumentModelWalker.acceptElement(DocumentModelWalker.java:110)
  	at com.mgmtp.a12.kernel.md.model.api.visitor.DocumentModelWalker.acceptChildren(DocumentModelWalker.java:180)
  	at com.mgmtp.a12.kernel.md.model.api.visitor.DocumentModelWalker.visitElementInheritance(DocumentModelWalker.java:156)
  	at com.mgmtp.a12.kernel.md.model.api.visitor.DocumentModelWalker.acceptElement(DocumentModelWalker.java:110)
  	at com.mgmtp.a12.kernel.md.model.api.visitor.DocumentModelWalker.acceptChildren(DocumentModelWalker.java:180)
  	at com.mgmtp.a12.kernel.md.model.api.visitor.DocumentModelWalker.acceptElements(DocumentModelWalker.java:100)
  	at com.mgmtp.a12.kernel.md.model.api.visitor.DocumentModelWalker.acceptDocumentModel(DocumentModelWalker.java:75)
  	at com.mgmtp.a12.dataservices.query.indexing.internal.persistence.DocumentModelFieldsIndexer.updateNewFields(DocumentModelFieldsIndexer.java:91)
  	at com.mgmtp.a12.dataservices.query.indexing.internal.persistence.DocumentModelFieldsIndexer.indexDocumentModelFieldsOnCreate(DocumentModelFieldsIndexer.java:62)
  	at com.mgmtp.a12.dataservices.model.internal.DefaultModelService.create(DefaultModelService.java:82)
  	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
  	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
  	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)
  	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
  	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
  	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380)
  	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
  	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
  	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)
  	at com.mgmtp.a12.dataservices.model.internal.DefaultModelService$$SpringCGLIB$$0.create(<generated>)
  	at com.mgmtp.a12.dataservices.model.bulkload.ModelBulkImporter.createOrUpdateModel(ModelBulkImporter.java:201)
  	at com.mgmtp.a12.dataservices.model.bulkload.ModelBulkImporter.getSavedHeader(ModelBulkImporter.java:194)
  	at com.mgmtp.a12.dataservices.model.bulkload.ModelBulkImporter.expandAndSaveDocumentModel(ModelBulkImporter.java:162)
  	at com.mgmtp.a12.dataservices.model.bulkload.ModelBulkImporter.lambda$processModels$0(ModelBulkImporter.java:113)
  	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
  	at java.base/java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1787)
  	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
  	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
  	at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310)
  	at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)
  	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
  	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
  	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
  	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
  	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
  	at com.mgmtp.a12.dataservices.model.bulkload.ModelBulkImporter.processModels(ModelBulkImporter.java:116)
  	at com.mgmtp.a12.dataservices.model.bulkload.ModelBulkImporter.doImport(ModelBulkImporter.java:97)
  	at com.mgmtp.a12.dataservices.initialization.BusinessModelInitializer.lambda$importBusinessModels$0(BusinessModelInitializer.java:52)
  	at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:1024)
  	at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
  	at com.mgmtp.a12.dataservices.initialization.BusinessModelInitializer.importBusinessModels(BusinessModelInitializer.java:49)
  	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
  	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
  	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)
  	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
  	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
  	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380)
  	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
  	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
  	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)
  	at com.mgmtp.a12.dataservices.initialization.BusinessModelInitializer$$SpringCGLIB$$0.importBusinessModels(<generated>)
  	at com.mgmtp.a12.dataservices.initialization.internal.DataServicesInitializationService.importModelsConditionally(DataServicesInitializationService.java:104)
  	at com.mgmtp.a12.dataservices.initialization.internal.DataServicesInitializationService.lambda$runInitialization$0(DataServicesInitializationService.java:71)
  	at com.mgmtp.a12.uaa.authentication.backend.BackendAuthenticationService.executeWithBackendAuthentication(BackendAuthenticationService.java:52)
  	at com.mgmtp.a12.dataservices.initialization.internal.DataServicesInitializationService.runInitialization(DataServicesInitializationService.java:67)
  	at com.mgmtp.a12.dataservices.initialization.DataServicesInitializationListener.onApplicationInitialization(DataServicesInitializationListener.java:44)
  	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
  	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
  	at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:382)
  	at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:254)
  	at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:173)
  	at com.mgmtp.a12.dataservices.common.events.internal.CommonDataServicesListenerMethodAdapter.onApplicationEvent(CommonDataServicesListenerMethodAdapter.java:45)
  	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:185)
  	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:178)
  	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:156)
  	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:454)
  	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:387)
  	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:1009)
  	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:630)
  	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
  	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
  	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
  	at org.springframework.boot.SpringApplication.run(SpringApplication.java:318)
  	at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:149)
  	at com.mgmtp.a12.dataservices.server.app.ServerApplication.start(ServerApplication.java:47)
  	at com.mgmtp.a12.dataservices.server.app.ServerApplication.main(ServerApplication.java:34)
  	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
  	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
  	at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:102)
  	at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64)
  	at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:40)

The only thing I noticed, that in the logs liquibase changesets were only executed up until version 37.0.0 - is there a changeset missing?
Or am I missing any configurations?

I already tried the embedded postgres alternative, for which the import appears to work. However, from time to time the embedded postgres appears to keep connections open which blocks clearing the temporary database…

Thanks a lot, Rene

According to GetA12 H2 database isn’t supported anymore. You might want to switch to the embedded postgres in your case.

It is still part of the Documentation though DS GetA12 as an available alternative - just not for productive use.

I can curtainly fallback to the embedded postgres - it just creates occasional shutdown issues..

Moin @rene-bright-bluff and @andreas-fresh-mesa,
thank you for bringing this issue up. It is indeed a mistake, neither the documentation nor the Spring profile for dataservices-embedded_h2 should be available anymore.

In the bug ticket A12-17663 this will be fixed meaning:

  • The Spring profile dataservices-embedded_h2 will be removed from autoconfiguration
  • The documentation for dataservices-embedded_h2 will be removed and contentstore-embedded_h2 will be updated to provide more information on the h2 usage in the content-store.

@jan-static-daemon Thanks for the clarification -

I am not really familiar with the terminology - “contentstore-embedded_h2” only refers to an in-memory attachment storage, which does not affect “regular” documents and models, does it?

So, an embedded postgres is the only supported solution for a temporary storage?

Moin @rene-bright-bluff,
exactly. The Data Services Content Store is only intended to be used for attachments and thumbnails.

Data Services provides the dataservices-embedded_postgres as replacement for the previous h2 database that contains, among other entities, the “regular” documents and models.

For example you can also configure the embedded postgres to run in the “in-file” mode by using the following properties:

spring.datasources.dataservices.embedded-postgres.path=<YOUR_DS_FILE_PATH>
spring.datasources.contentstore.embedded-postgres.path=<YOUR_CS_FILE_PATH>