On app restart, during a bean initialization method, an entity is loaded from second level cache, and AttributeConverter fails with ClassCastException.

URLImpl class extends URL interface. Entity has a URL member.

Error: class myapp.util.web.URLImpl cannot be cast to class myapp.util.web.URL (myapp.util.web.URLImpl is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @7c6d5da4; myapp.util.web.URL is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @24547d63)

Converter:

@Converter(autoApply = true)
public class URLToStringConverter implements AttributeConverter<URL, String> {
    @Override
    public String convertToDatabaseColumn( @NotNull URL uri ) {
        if (uri == null)
            return null;
        return uri.toString();
    }

    @Override
    public URL convertToEntityAttribute( @NotNull String s ) {
        if (s == null || s.isBlank())
            return null;
        try {
            return URL.create( s );
        } catch (URISyntaxException e) {
            throw new IllegalArgumentException( String.format( "Invalid url: %s", s ), e );
        }
    }
}

Stacktrace:

Stacktrace
convertToDatabaseColumn:13, URLToStringConverter (myapp.util.data.converters)
toRelationalValue:50, JpaAttributeConverterImpl (org.hibernate.metamodel.model.convert.internal)
deepCopyNotNull:33, AttributeConverterMutabilityPlanImpl (org.hibernate.type.descriptor.converter)
deepCopy:35, MutableMutabilityPlan (org.hibernate.type.descriptor.java)
assemble:30, MutableMutabilityPlan (org.hibernate.type.descriptor.java)
assemble:319, AbstractStandardBasicType (org.hibernate.type)
assemble:101, TypeHelper (org.hibernate.type)
assemble:135, StandardCacheEntryImpl (org.hibernate.cache.spi.entry)
convertCacheEntryToEntity:312, CacheEntityLoaderHelper (org.hibernate.loader.entity)
processCachedEntry:178, CacheEntityLoaderHelper (org.hibernate.loader.entity)
loadFromSecondLevelCache:151, CacheEntityLoaderHelper (org.hibernate.loader.entity)
doLoad:521, DefaultLoadEventListener (org.hibernate.event.internal)
load:208, DefaultLoadEventListener (org.hibernate.event.internal)
proxyOrLoad:332, DefaultLoadEventListener (org.hibernate.event.internal)
doOnLoad:108, DefaultLoadEventListener (org.hibernate.event.internal)
onLoad:74, DefaultLoadEventListener (org.hibernate.event.internal)
applyEventToListener:-1, 2081259348 (org.hibernate.internal.SessionImpl$$Lambda$1343)
fireEventOnEachListener:113, EventListenerGroupImpl (org.hibernate.event.service.internal)
fireLoadNoChecks:1187, SessionImpl (org.hibernate.internal)
internalLoad:1052, SessionImpl (org.hibernate.internal)
resolveIdentifier:697, EntityType (org.hibernate.type)
resolveIdentifier:713, EntityType (org.hibernate.type)
assemble:302, ManyToOneType (org.hibernate.type)
assemble:101, TypeHelper (org.hibernate.type)
assemble:135, StandardCacheEntryImpl (org.hibernate.cache.spi.entry)
convertCacheEntryToEntity:312, CacheEntityLoaderHelper (org.hibernate.loader.entity)
processCachedEntry:178, CacheEntityLoaderHelper (org.hibernate.loader.entity)
loadFromSecondLevelCache:151, CacheEntityLoaderHelper (org.hibernate.loader.entity)
doLoad:521, DefaultLoadEventListener (org.hibernate.event.internal)
load:208, DefaultLoadEventListener (org.hibernate.event.internal)
proxyOrLoad:332, DefaultLoadEventListener (org.hibernate.event.internal)
doOnLoad:108, DefaultLoadEventListener (org.hibernate.event.internal)
onLoad:74, DefaultLoadEventListener (org.hibernate.event.internal)
applyEventToListener:-1, 2081259348 (org.hibernate.internal.SessionImpl$$Lambda$1343)
fireEventOnEachListener:113, EventListenerGroupImpl (org.hibernate.event.service.internal)
fireLoadNoChecks:1187, SessionImpl (org.hibernate.internal)
internalLoad:1052, SessionImpl (org.hibernate.internal)
resolveIdentifier:697, EntityType (org.hibernate.type)
resolve:464, EntityType (org.hibernate.type)
resolve:240, ManyToOneType (org.hibernate.type)
lambda$static$0:686, TwoPhaseLoad$EntityResolver (org.hibernate.engine.internal)
resolve:-1, 1357139018 (org.hibernate.engine.internal.TwoPhaseLoad$EntityResolver$$Lambda$1342)
initializeEntityEntryLoadedState:276, TwoPhaseLoad (org.hibernate.engine.internal)
initializeEntity:184, TwoPhaseLoad (org.hibernate.engine.internal)
initializeEntity:153, TwoPhaseLoad (org.hibernate.engine.internal)
initializeEntitiesAndCollections:1229, Loader (org.hibernate.loader)
processResultSet:1006, Loader (org.hibernate.loader)
doQuery:964, Loader (org.hibernate.loader)
doQueryAndInitializeNonLazyCollections:350, Loader (org.hibernate.loader)
doList:2887, Loader (org.hibernate.loader)
doList:2869, Loader (org.hibernate.loader)
listIgnoreQueryCache:2701, Loader (org.hibernate.loader)
list:2696, Loader (org.hibernate.loader)
list:506, QueryLoader (org.hibernate.loader.hql)
list:400, QueryTranslatorImpl (org.hibernate.hql.internal.ast)
performList:219, HQLQueryPlan (org.hibernate.engine.query.spi)
list:1415, SessionImpl (org.hibernate.internal)
doList:1565, AbstractProducedQuery (org.hibernate.query.internal)
list:1533, AbstractProducedQuery (org.hibernate.query.internal)
getResultList:165, Query (org.hibernate.query)
getResultList:76, CriteriaQueryTypeQueryAdapter (org.hibernate.query.criteria.internal.compile)
findAll:355, SimpleJpaRepository (org.springframework.data.jpa.repository.support)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:62, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:566, Method (java.lang.reflect)
invoke:72, ImplementationInvocationMetadata (org.springframework.data.repository.core.support)
invoke:382, RepositoryComposition$RepositoryFragments (org.springframework.data.repository.core.support)
invoke:205, RepositoryComposition (org.springframework.data.repository.core.support)
invoke:549, RepositoryFactorySupport$ImplementationMethodExecutionInterceptor (org.springframework.data.repository.core.support)
proceed:186, ReflectiveMethodInvocation (org.springframework.aop.framework)
doInvoke:155, QueryExecutorMethodInterceptor (org.springframework.data.repository.core.support)
invoke:130, QueryExecutorMethodInterceptor (org.springframework.data.repository.core.support)
proceed:186, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:80, DefaultMethodInvokingMethodInterceptor (org.springframework.data.projection)
proceed:186, ReflectiveMethodInvocation (org.springframework.aop.framework)
proceedWithInvocation:-1, 1338494031 (org.springframework.transaction.interceptor.TransactionInterceptor$$Lambda$1332)
invokeWithinTransaction:367, TransactionAspectSupport (org.springframework.transaction.interceptor)
invoke:118, TransactionInterceptor (org.springframework.transaction.interceptor)
proceed:186, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:139, PersistenceExceptionTranslationInterceptor (org.springframework.dao.support)
proceed:186, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:178, CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor (org.springframework.data.jpa.repository.support)
proceed:186, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:95, ExposeInvocationInterceptor (org.springframework.aop.interceptor)
proceed:186, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:212, JdkDynamicAopProxy (org.springframework.aop.framework)
findAll:-1, $Proxy314 (com.sun.proxy)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:62, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:566, Method (java.lang.reflect)
invokeJoinpointUsingReflection:344, AopUtils (org.springframework.aop.support)
invoke:205, JdkDynamicAopProxy (org.springframework.aop.framework)
findAll:-1, $Proxy312 (com.sun.proxy)
afterPropertiesSet_aroundBody0:44, ShopCrawlerInfoService (myapp.site.crawler.shop)
run:1, ShopCrawlerInfoService$AjcClosure1 (myapp.site.crawler.shop)
ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96cproceed:66, AbstractTransactionAspect (org.springframework.transaction.aspectj)
proceedWithInvocation:72, AbstractTransactionAspect$AbstractTransactionAspect$1 (org.springframework.transaction.aspectj)
invokeWithinTransaction:367, TransactionAspectSupport (org.springframework.transaction.interceptor)
ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c:70, AbstractTransactionAspect (org.springframework.transaction.aspectj)
afterPropertiesSet:36, ShopCrawlerInfoService (myapp.site.crawler.shop)
invokeInitMethods:1853, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1790, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:594, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 1006051786 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$326)
getSingleton:226, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:276, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1307, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1227, DefaultListableBeanFactory (org.springframework.beans.factory.support)
inject:640, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:130, InjectionMetadata (org.springframework.beans.factory.annotation)
postProcessProperties:399, AutowiredAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
populateBean:1420, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:593, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 1006051786 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$326)
getSingleton:226, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:276, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1307, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1227, DefaultListableBeanFactory (org.springframework.beans.factory.support)
inject:640, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:130, InjectionMetadata (org.springframework.beans.factory.annotation)
postProcessProperties:399, AutowiredAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
populateBean:1420, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:593, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 1006051786 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$326)
getSingleton:226, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:276, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1307, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1227, DefaultListableBeanFactory (org.springframework.beans.factory.support)
inject:640, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:130, InjectionMetadata (org.springframework.beans.factory.annotation)
postProcessProperties:399, AutowiredAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
populateBean:1420, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:593, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 1006051786 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$326)
getSingleton:226, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:276, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1307, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1227, DefaultListableBeanFactory (org.springframework.beans.factory.support)
inject:640, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:130, InjectionMetadata (org.springframework.beans.factory.annotation)
postProcessProperties:399, AutowiredAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
populateBean:1420, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:593, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 1006051786 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$326)
getSingleton:226, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:276, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1307, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1227, DefaultListableBeanFactory (org.springframework.beans.factory.support)
inject:640, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:130, InjectionMetadata (org.springframework.beans.factory.annotation)
postProcessProperties:399, AutowiredAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
populateBean:1420, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:593, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 1006051786 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$326)
getSingleton:226, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:897, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:879, AbstractApplicationContext (org.springframework.context.support)
refresh:551, AbstractApplicationContext (org.springframework.context.support)
refresh:143, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context)
refresh:758, SpringApplication (org.springframework.boot)
refresh:750, SpringApplication (org.springframework.boot)
refreshContext:397, SpringApplication (org.springframework.boot)
run:315, SpringApplication (org.springframework.boot)
main:90, Application (pse)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:62, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:566, Method (java.lang.reflect)
run:49, RestartLauncher (org.springframework.boot.devtools.restart)

Comment From: wilkinsona

You've ended up with an instance of myapp.util.web.URLImpl that was loaded from one iteration of your app and its interface, myapp.util.web.URL, loaded from another. That's probably due to how the instance is being retrieved from the second-level cache but I can't say for sure as you haven't shown how that's being done.

If you would like us to spend some more time investigating, please spend some time providing a complete yet minimal sample that reproduces the problem. You can share it with us by pushing it to a separate repository on GitHub or by zipping it up and attaching it to this issue.

Comment From: cdalexndr

Sample repository: https://github.com/cdalexndr/spring-boot-issue-23729

Reproduction steps: 1. gradlew bootRun //generates disk cache 2. stop app 3. gradlew bootRun 4. edit ./build/resources/trigger.txt to trigger app restart 5. exception

Comment From: snicoll

Thanks for the sample. @wilkinsona already explained what is going on.

That's probably due to how the instance is being retrieved from the second-level cache

This section of the reference guide describes how to configure devtools so that objects that are persisted to disk can be safely restored across restarts.

I've included ehcache to the restart classloader and the exception described above went away. Unfortunately, ehcache now complains that the persistence directory is already locked by this process:

Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.IllegalStateException: Cache provider not started
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:403) ~[spring-orm-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.lang.IllegalStateException: Cache provider not started
    at org.hibernate.cache.spi.AbstractRegionFactory.verifyStarted(AbstractRegionFactory.java:65) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.cache.jcache.internal.JCacheRegionFactory.getOrCreateCache(JCacheRegionFactory.java:89) ~[hibernate-jcache-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.cache.jcache.internal.JCacheRegionFactory.createDomainDataStorageAccess(JCacheRegionFactory.java:83) ~[hibernate-jcache-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.cache.jcache.internal.JCacheRegionFactory.buildDomainDataRegion(JCacheRegionFactory.java:72) ~[hibernate-jcache-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.cache.internal.EnabledCaching.prime(EnabledCaching.java:113) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.metamodel.internal.MetamodelImpl.primeSecondLevelCacheRegions(MetamodelImpl.java:331) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:160) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:301) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:469) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1259) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391) ~[spring-orm-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    ... 4 common frames omitted
Caused by: org.ehcache.StateTransitionException: Persistence directory already locked by this process: /Users/snicoll/Downloads/spring-boot-issue-23729-master/./cache
    at org.ehcache.core.StatusTransitioner$Transition.failed(StatusTransitioner.java:235) ~[ehcache-3.8.1.jar:3.8.1 a19322e8d4b3f7157e878112c2afc0b6e3090fdd]
    at org.ehcache.core.EhcacheManager.init(EhcacheManager.java:605) ~[ehcache-3.8.1.jar:3.8.1 a19322e8d4b3f7157e878112c2afc0b6e3090fdd]
    at org.ehcache.jsr107.EhcacheCachingProvider.createCacheManager(EhcacheCachingProvider.java:159) ~[ehcache-3.8.1.jar:3.8.1 a19322e8d4b3f7157e878112c2afc0b6e3090fdd]
    at org.ehcache.jsr107.EhcacheCachingProvider.getCacheManager(EhcacheCachingProvider.java:134) ~[ehcache-3.8.1.jar:3.8.1 a19322e8d4b3f7157e878112c2afc0b6e3090fdd]
    at org.ehcache.jsr107.EhcacheCachingProvider.getCacheManager(EhcacheCachingProvider.java:97) ~[ehcache-3.8.1.jar:3.8.1 a19322e8d4b3f7157e878112c2afc0b6e3090fdd]
    at example.CacheConfiguration.resolveCacheManager(CacheConfiguration.java:39) ~[main/:na]
    at org.hibernate.cache.jcache.internal.JCacheRegionFactory.prepareForUse(JCacheRegionFactory.java:189) ~[hibernate-jcache-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.cache.spi.AbstractRegionFactory.start(AbstractRegionFactory.java:91) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.cache.internal.EnabledCaching.<init>(EnabledCaching.java:82) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:33) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:24) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.service.spi.SessionFactoryServiceInitiator.initiateService(SessionFactoryServiceInitiator.java:30) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.initiateService(SessionFactoryServiceRegistryImpl.java:62) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.getService(SessionFactoryServiceRegistryImpl.java:98) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:245) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
    ... 9 common frames omitted
Caused by: java.lang.RuntimeException: Persistence directory already locked by this process: /Users/snicoll/Downloads/spring-boot-issue-23729-master/./cache
    at org.ehcache.impl.persistence.DefaultLocalPersistenceService.internalStart(DefaultLocalPersistenceService.java:95) ~[ehcache-3.8.1.jar:3.8.1 a19322e8d4b3f7157e878112c2afc0b6e3090fdd]
    at org.ehcache.impl.persistence.DefaultLocalPersistenceService.start(DefaultLocalPersistenceService.java:75) ~[ehcache-3.8.1.jar:3.8.1 a19322e8d4b3f7157e878112c2afc0b6e3090fdd]
    at org.ehcache.core.spi.ServiceLocator.startAllServices(ServiceLocator.java:128) ~[ehcache-3.8.1.jar:3.8.1 a19322e8d4b3f7157e878112c2afc0b6e3090fdd]
    at org.ehcache.core.EhcacheManager.init(EhcacheManager.java:577) ~[ehcache-3.8.1.jar:3.8.1 a19322e8d4b3f7157e878112c2afc0b6e3090fdd]
    ... 25 common frames omitted
Caused by: java.nio.channels.OverlappingFileLockException: null
    at java.base/sun.nio.ch.FileLockTable.checkList(FileLockTable.java:229) ~[na:na]
    at java.base/sun.nio.ch.FileLockTable.add(FileLockTable.java:123) ~[na:na]
    at java.base/sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1154) ~[na:na]
    at java.base/java.nio.channels.FileChannel.tryLock(FileChannel.java:1165) ~[na:na]
    at org.ehcache.impl.persistence.DefaultLocalPersistenceService.internalStart(DefaultLocalPersistenceService.java:93) ~[ehcache-3.8.1.jar:3.8.1 a19322e8d4b3f7157e878112c2afc0b6e3090fdd]
    ... 28 common frames omitted

I am afraid we can't provide you support for the ehcache issue. I would personally fallback on a much simpler cache arrangement while developing in the IDE, this StackOverflow answer provides some more details.