-
-
Save gokhanoner/cdeace124489b3c13efb0908bf1b559b to your computer and use it in GitHub Desktop.
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> |
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.
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. :)
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
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 :)
In fact, it works with v3.9 as well.
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?
Hi eric ,
How did you fix this issue ?
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