[Spring] JPA (Hibernate) - Error (creating bean with name 'entityManagerFactory')

JDK를 openjdk11로 변경했더니 startup할 때 오류가 발생 #

 1ERROR o.s.boot.SpringApplication - Application run failed
 2org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
 3at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1699)
 4at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:573)
 5at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495)
 6at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
 7at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
 8at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
 9at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
10at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1089)
11at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:859)
12at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
13at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
14at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762)
15at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:398)
16at org.springframework.boot.SpringApplication.run(SpringApplication.java:330)
17at org.springframework.boot.SpringApplication.run(SpringApplication.java:1258)
18at org.springframework.boot.SpringApplication.run(SpringApplication.java:1246)
19at com.yhkim.study.FirstprojectApplication.main(FirstprojectApplication.java:10)
20Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate essionFactory; nested exception is org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
21at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:402)
22at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377)
23at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
24at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1758)
25at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1695)
26... 16 common frames omitted
27Caused by: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
28at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123)
29at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77)
30at org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:129)
31at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:300)
32at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:462)
33at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:892)
34at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57)
35at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
36at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390)
37... 20 common frames omitted
38Caused by: org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
39at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:91)
40at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:116)
41at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:382)
42at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:519)
43at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:124)
44at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
45at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
46at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
47at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
48at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96)
49... 28 common frames omitted
50Caused by: java.lang.reflect.InvocationTargetException: null
51at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
52at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
53at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
54at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
55at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:88)
56... 37 common frames omitted
57Caused by: java.lang.NullPointerException: null
58at javassist.util.proxy.SecurityActions.setAccessible(SecurityActions.java:103)
59at javassist.util.proxy.DefineClassHelper.toClass3(DefineClassHelper.java:151)
60at javassist.util.proxy.DefineClassHelper.toClass2(DefineClassHelper.java:134)
61at javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:95)
62at javassist.util.proxy.FactoryHelper.toClass(FactoryHelper.java:131)
63at javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:530)
64at javassist.util.proxy.ProxyFactory.createClass2(ProxyFactory.java:515)
65at javassist.util.proxy.ProxyFactory.createClass1(ProxyFactory.java:451)
66at javassist.util.proxy.ProxyFactory.createClass(ProxyFactory.java:422)
67at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.postInstantiate(JavassistProxyFactory.java:75)
68at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:162)
69at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:156)
70at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:58)
71... 42 common frames omitted

원인 #

  • JPA(Hibernate)라는 것은 결국 BCI방식으로 class load시점에 entity와 JPA Interface를 이용하여 SQL문을 자동 생성하여 삽입시켜주는 역할
  • 로그를 보면 org.hibernate.persister.entity.SingleTableEntityPersister의 생성자에서 그 역할을 하는듯 하다.
  • 그런데 openjdk11에서는 javaassist가 removed 되었는지 entityManagerFactory 빈을 생성할 때
    • at javassist.util.proxy.SecurityActions.setAccessible(SecurityActions.java:103)에서 NullPointerException이 발생한다.

해결 #

  • pom.xml에 javassist에 대한 dependency를 추가해주면 된다.

    1<dependency>
    2  <groupId>org.javassist</groupId>
    3  <artifactId>javassist</artifactId>
    4  <version>3.23.1-GA</version>
    5</dependency>
Advertisement