Skip to content

Instantly share code, notes, and snippets.

@gokhanoner
Created November 5, 2017 22:07
Show Gist options
  • Save gokhanoner/cdeace124489b3c13efb0908bf1b559b to your computer and use it in GitHub Desktop.
Save gokhanoner/cdeace124489b3c13efb0908bf1b559b to your computer and use it in GitHub Desktop.
hazelcast-hibernate5.2-spring_boot
spring.jpa.properties.hibernate.cache.region.factory_class=com.hazelcast.hibernate.HazelcastCacheRegionFactory
# Needed to use defined HazelcastInstance instead of creating a new one
spring.jpa.properties.hibernate.cache.hazelcast.instance_name=myHzInstance
package com.example.hazelcasthibernatespring;
import com.hazelcast.config.Config;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import lombok.Data;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.CreationTimestamp;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.jpa.repository.JpaRepository;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.time.LocalDateTime;
import java.util.UUID;
import java.util.stream.IntStream;
@SpringBootApplication
public class HazelcastHibernateSpringApplication {
public static void main(String[] args) {
SpringApplication.run(HazelcastHibernateSpringApplication.class, args);
}
//Only needed to check size in CLI Bean, otherwise created automatically by
// com.hazelcast.hibernate.instance.HazelcastInstanceLoader
@Bean
HazelcastInstance hazelcastInstance() {
Config config = new Config().setInstanceName("myHzInstance");
return Hazelcast.newHazelcastInstance(config);
}
@Bean
CommandLineRunner clr(MyEntityRepo repo, HazelcastInstance hz) {
return (String... args) -> {
//save to DB
IntStream.range(0, 100)
.boxed()
.map(i -> MyEntity.of("name-" + i))
.forEach(repo::save);
//get from Hazelcast to see Cache is working
System.out.println(hz.getMap(MyEntity.class.getSimpleName()).size());
};
}
}
interface MyEntityRepo extends JpaRepository<MyEntity, UUID> {
}
@Entity
@Data
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "MyEntity")
class MyEntity {
@Id
@GeneratedValue
private UUID id;
private String name;
@Column(updatable = false)
@CreatedBy
protected String createdBy;
@Column(updatable = false)
@CreationTimestamp
protected LocalDateTime createdOn;
public static MyEntity of(String name) {
MyEntity entity = new MyEntity();
entity.setName(name);
return entity;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>hazelcast-hibernate-spring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>hazelcast-hibernate-spring</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<hazelcast.version>3.9</hazelcast.version>
<hibernate.version>5.2.12.Final</hibernate.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-hibernate52</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-spring</artifactId>
<version>${hazelcast.version}</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
@ericjturley
Copy link

ericjturley commented Nov 6, 2017

Thanks very much for the info.
I'm still getting ParserConfigurationException
There are some differences between your example and mine, but none stand out to me.
Does this stack give you any clues?

2017-11-06 17:00:14.286  INFO 13264 --- [  restartedMain] c.h.h.HazelcastCacheRegionFactory        : Starting up HazelcastCacheRegionFactory
2017-11-06 17:00:14.302  INFO 13264 --- [  restartedMain] com.hazelcast.config.XmlConfigLocator    : Loading 'hazelcast-default.xml' from classpath.
2017-11-06 17:00:14.315  WARN 13264 --- [  restartedMain] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory

....

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1078)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:857)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
	at com.blizzard.meetups.api.MeetupsApiApplication.main(MeetupsApiApplication.java:36)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:967)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:892)
	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
	... 21 common frames omitted
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.spi.CacheImplementor]
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:271)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:233)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:210)
	at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.getService(SessionFactoryServiceRegistryImpl.java:80)
	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:244)
	at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:452)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:889)
	... 27 common frames omitted
Caused by: org.hibernate.cache.CacheException: com.hazelcast.core.HazelcastException: javax.xml.parsers.ParserConfigurationException
	at com.hazelcast.hibernate.instance.DefaultHazelcastInstanceFactory.createInstanceLoader(DefaultHazelcastInstanceFactory.java:40)
	at com.hazelcast.hibernate.AbstractHazelcastCacheRegionFactory.start(AbstractHazelcastCacheRegionFactory.java:89)
	at org.hibernate.cache.spi.RegionFactory.start(RegionFactory.java:63)
	at org.hibernate.internal.CacheImpl.<init>(CacheImpl.java:71)
	at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:28)
	at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:20)
	at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.initiateService(SessionFactoryServiceRegistryImpl.java:59)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:259)
	... 33 common frames omitted
Caused by: com.hazelcast.core.HazelcastException: javax.xml.parsers.ParserConfigurationException
	at com.hazelcast.util.ExceptionUtil$1.create(ExceptionUtil.java:40)
	at com.hazelcast.util.ExceptionUtil.peel(ExceptionUtil.java:124)
	at com.hazelcast.util.ExceptionUtil.peel(ExceptionUtil.java:69)
	at com.hazelcast.util.ExceptionUtil.rethrow(ExceptionUtil.java:129)
	at com.hazelcast.config.XmlConfigBuilder.build(XmlConfigBuilder.java:218)
	at com.hazelcast.config.XmlConfigBuilder.build(XmlConfigBuilder.java:209)
	at com.hazelcast.hibernate.instance.HazelcastInstanceLoader.configure(HazelcastInstanceLoader.java:65)
	at com.hazelcast.hibernate.instance.DefaultHazelcastInstanceFactory.createInstanceLoader(DefaultHazelcastInstanceFactory.java:37)
	... 40 common frames omitted
Caused by: javax.xml.parsers.ParserConfigurationException: null
	at oracle.xml.jaxp.JXDocumentBuilderFactory.setFeature(JXDocumentBuilderFactory.java:326)
	at com.hazelcast.config.XmlConfigBuilder.parse(XmlConfigBuilder.java:258)
	at com.hazelcast.config.XmlConfigBuilder.parseAndBuildConfig(XmlConfigBuilder.java:225)
	at com.hazelcast.config.XmlConfigBuilder.build(XmlConfigBuilder.java:216)
	... 43 common frames omitted

@ericjturley
Copy link

ericjturley commented Nov 6, 2017

I do NOT have a hazelcast.xml file defined because I want to (initially) just use the default one in the jar, and I wanted to isolate possible misconfigurations I may have added to the config.

I also have this additional line added (which you didn't include above):
spring.jpa.properties.hibernate.cache.use_second_level_cache=true

@gokhanoner
Copy link
Author

Can you try removing hazelcast from your local maven repo, then try again. Also, try with 3.8.6 as well.

I also didn't use XML config file, used the default one.

@ericjturley
Copy link

Hey! Sorry for the delay. The hard drive in my laptop died. Blizzard has replaced it now, and I'm gonna give this a shot.
Since my hard drive has been wiped, I guess that covers the "removing hazelcast from your local maven repo" request. :)

@ericjturley
Copy link

OK, I've made that version change.
Also - I'm not using the code you have in your HazelcastHibernateSpringApplication, because your comment says it's not needed.

But now I'm getting a different error:

2017-11-09 16:49:17.849  INFO 9536 --- [  restartedMain] c.h.h.HazelcastCacheRegionFactory        : Starting up HazelcastCacheRegionFactory
2017-11-09 16:49:17.851  INFO 9536 --- [  restartedMain] c.h.h.i.IHazelcastInstanceFactory        : Using existing HazelcastInstance [myHzInstance].
2017-11-09 16:49:17.853  WARN 9536 --- [  restartedMain] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
2017-11-09 16:49:18.224 ERROR 9536 --- [  restartedMain] o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1078)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:857)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
...
	at com.blizzard.meetups.api.MeetupsApiApplication.main(MeetupsApiApplication.java:36)
...
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:967)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:892)
	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
	... 21 common frames omitted
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.spi.CacheImplementor]
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:271)
	... 27 common frames omitted

Caused by: org.hibernate.cache.CacheException: No instance with name [myHzInstance] could be found.
	at com.hazelcast.hibernate.instance.HazelcastInstanceLoader.loadInstance(HazelcastInstanceLoader.java:77)
	at com.hazelcast.hibernate.AbstractHazelcastCacheRegionFactory.start(AbstractHazelcastCacheRegionFactory.java:97)
	at org.hibernate.cache.spi.RegionFactory.start(RegionFactory.java:63)
	at org.hibernate.internal.CacheImpl.<init>(CacheImpl.java:71)
	at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:28)
	at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:20)
	at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.initiateService(SessionFactoryServiceRegistryImpl.java:59)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:259)
	... 33 common frames omitted

@ericjturley
Copy link

I've added the bean to my application, and now it works!

Members [1] {
	Member [10.131.140.214]:5701 - 04b63181-c0bf-4d92-90fe-a81b8ca5fbca this
}

Thanks :)

@ericjturley
Copy link

In fact, it works with v3.9 as well.

@ericjturley
Copy link

But now I'm getting:
com.hazelcast.core.DuplicateInstanceNameException: HazelcastInstance with name 'meetup_api_hazelcast_cluster' already exists!

I need to figure out either why that's happening, or how to turn off caching during tests.
Any ideas?

@enesoz
Copy link

enesoz commented Oct 9, 2018

Hi eric ,

How did you fix this issue ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment