I am using eclipse link jpa implementation with spring boot 3 and when i try to migrate to hibernate 6, application is failed at startup saying error creating bean ‘entityManagerFactory’ java heap space OutOfMemory exception.
Application used to create tables and start quickly with eclipse link but with hibernate 6 it is taking time and failing with above mentioned exception, I have just changed the dependency and added hibernate configuration while migrating to hibernate 6.
When I increase heap space to 8Gb then it starting.
I can’t able to understand why hibernate is taking too long to create tables and using more heap space.
eclipselink configuration:
@Bean
public LocalEntityManagerFactoryBean entityManagerFactory() {
LocalEntityManagerFactoryBean bean = new LocalEntityManagerFactoryBean();
bean.setPersistenceUnitName(PersistenceServiceImpl.PERSISTENCE_UNIT);
bean.setJpaProperties(getPersistenceProperties(jpaConfiguration));
bean.setJpaVendorAdapter(jpaVendorAdapter());
return bean;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
return new EclipseLinkJpaVendorAdapter();
}
private Properties getPersistenceProperties(JPAConfiguration jpaConfiguration) {
Properties persistenceProperties = new Properties();
persistenceProperties.put(TRANSACTION_TYPE, PersistenceUnitTransactionType.RESOURCE_LOCAL.name());
persistenceProperties.put(LOGGING_LEVEL, "SEVERE");
persistenceProperties.put(LOGGING_LOGGER, "JavaLogger");
persistenceProperties.put(DDL_GENERATION, CREATE_OR_EXTEND);
persistenceProperties.put(CONNECTION_POOL + CONNECTION_POOL_MAX, "5");
persistenceProperties.put(WEAVING, "false");
persistenceProperties.put(JDBC_URL, getConnectionString(jpaConfiguration));
persistenceProperties.put(JDBC_DRIVER, PersistenceServiceImpl.POSTGRES_DRIVER);
persistenceProperties.put(JDBC_USER, jpaConfiguration.getDbUsername());
persistenceProperties.put(JDBC_PASSWORD, jpaConfiguration.getDbPassword());
return persistenceProperties;
}
@Bean
public DataSource dataSource(JPAConfiguration jpaConfiguration) {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(PersistenceServiceImpl.POSTGRES_DRIVER);
dataSource.setUrl(getConnectionString(jpaConfiguration));
dataSource.setUsername(jpaConfiguration.getDbUsername());
dataSource.setPassword(jpaConfiguration.getDbPassword());
return dataSource;
}
private String getConnectionString(JPAConfiguration jpaConfiguration) {
// build from settings values
return new StringBuilder()
.append(PersistenceServiceImpl.JDBC_URL_PREFIX)
.append(jpaConfiguration.getDbHost()).append(":")
.append(jpaConfiguration.getDbPort()).append("/")
.append(jpaConfiguration.getDbName())
.toString();
}
Persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="client-packager">
<class>com.example.entity.notes</class>
.
.
. //all entity classes
</persistence-unit>
</persistence>
hibernate configuration: using same persistence.xml for hibernate too.
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();
Map<String, Object> jpaPropertiesMap = new HashMap<>(jpaProperties.getProperties());
bean.setDataSource(dataSource);
bean.setPersistenceUnitName(PersistenceServiceImpl.PERSISTENCE_UNIT);
bean.setJpaVendorAdapter(jpaVendorAdapter());
return bean;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
return hibernateJpaVendorAdapter;
}
@Bean
public DataSource dataSource(JPAConfiguration jpaConfiguration) {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(PersistenceServiceImpl.POSTGRES_DRIVER);
dataSource.setUrl(getConnectionString(jpaConfiguration));
dataSource.setUsername(jpaConfiguration.getDbUsername());
dataSource.setPassword(jpaConfiguration.getDbPassword());
return dataSource;
}
Error:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in com.example.DemoApplication: Java heap space
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1773) ~[spring-beans-6.1.2.jar:6.1.2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:599) ~[spring-beans-6.1.2.jar:6.1.2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) ~[spring-beans-6.1.2.jar:6.1.2]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) ~[spring-beans-6.1.2.jar:6.1.2]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.2.jar:6.1.2]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) ~[spring-beans-6.1.2.jar:6.1.2]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-6.1.2.jar:6.1.2]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1232) ~[spring-context-6.1.2.jar:6.1.2]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:950) ~[spring-context-6.1.2.jar:6.1.2]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625) ~[spring-context-6.1.2.jar:6.1.2]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.1.jar:3.2.1]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762) ~[spring-boot-3.2.1.jar:3.2.1]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:464) ~[spring-boot-3.2.1.jar:3.2.1]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) ~[spring-boot-3.2.1.jar:3.2.1]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1358) ~[spring-boot-3.2.1.jar:3.2.1]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1347) ~[spring-boot-3.2.1.jar:3.2.1]
at com.example.DemoApplication.main(DemoApplication.java:88) ~[classes/:na]
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.AbstractList.listIterator(AbstractList.java:340) ~[na:na]
at java.base/java.util.AbstractList.listIterator(AbstractList.java:311) ~[na:na]
at java.base/java.util.AbstractList.equals(AbstractList.java:543) ~[na:na]
at org.hibernate.metamodel.mapping.AssociationKey.equals(AssociationKey.java:44) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at java.base/java.util.HashMap.removeNode(HashMap.java:818) ~[na:na]
at java.base/java.util.HashMap.remove(HashMap.java:797) ~[na:na]
at java.base/java.util.HashSet.remove(HashSet.java:237) ~[na:na]
at org.hibernate.loader.ast.internal.LoaderSqlAstCreationState.removeVisitedAssociationKey(LoaderSqlAstCreationState.java:199) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.withRegisteredAssociationKeys(ToOneAttributeMapping.java:1810) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.generateFetch(ToOneAttributeMapping.java:1530) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.generateFetch(ToOneAttributeMapping.java:113) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.sql.results.graph.FetchParent.generateFetchableFetch(FetchParent.java:110) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.loader.ast.internal.LoaderSelectBuilder.lambda$createFetchableConsumer$3(LoaderSelectBuilder.java:987) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.loader.ast.internal.LoaderSelectBuilder$$Lambda$1295/0x00000008015b57f8.accept(Unknown Source) ~[na:na]
at org.hibernate.loader.ast.internal.LoaderSelectBuilder.visitFetches(LoaderSelectBuilder.java:812) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.loader.ast.internal.LoaderSelectBuilder$$Lambda$1288/0x00000008015af5a8.visitFetches(Unknown Source) ~[na:na]
at org.hibernate.loader.ast.internal.LoaderSqlAstCreationState.visitFetches(LoaderSqlAstCreationState.java:150) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.sql.results.graph.AbstractFetchParent.afterInitialize(AbstractFetchParent.java:30) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.sql.results.graph.embeddable.internal.EmbeddableFetchImpl.<init>(EmbeddableFetchImpl.java:78) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.metamodel.mapping.internal.EmbeddedAttributeMapping.generateFetch(EmbeddedAttributeMapping.java:265) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.sql.results.graph.FetchParent.generateFetchableFetch(FetchParent.java:110) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.loader.ast.internal.LoaderSelectBuilder.lambda$createFetchableConsumer$3(LoaderSelectBuilder.java:987) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.loader.ast.internal.LoaderSelectBuilder$$Lambda$1295/0x00000008015b57f8.accept(Unknown Source) ~[na:na]
at org.hibernate.loader.ast.internal.LoaderSelectBuilder.visitFetches(LoaderSelectBuilder.java:812) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.loader.ast.internal.LoaderSelectBuilder$$Lambda$1288/0x00000008015af5a8.visitFetches(Unknown Source) ~[na:na]
at org.hibernate.loader.ast.internal.LoaderSqlAstCreationState.visitFetches(LoaderSqlAstCreationState.java:150) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.sql.results.graph.AbstractFetchParent.afterInitialize(AbstractFetchParent.java:30) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.sql.results.graph.entity.AbstractEntityResultGraphNode.afterInitialize(AbstractEntityResultGraphNode.java:69) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.sql.results.graph.entity.internal.EntityFetchJoinedImpl.<init>(EntityFetchJoinedImpl.java:58) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.buildEntityFetchJoined(ToOneAttributeMapping.java:1396) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.lambda$generateFetch$0(ToOneAttributeMapping.java:1556) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]
at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping$$Lambda$1300/0x00000008015bcfb0.get(Unknown Source) ~[na:an]
