hibernateを使用してec2とrds(mysql)を接続したい。 しかし、「Unable to build Hibernate SessionFactory」とエラーが出ます。
解決したいこと
hibernateを使用してec2とrds(mysql)を接続したい。
しかし、「Unable to build Hibernate SessionFactory」とエラーが出ます。
環境
エラーが出ているwebアプリケーションの内容です。
言語:java17
コンテナ:tomcat8.5.75
ビルドツール:maven
DB:mysql(rds)
サーバー:EC2(aws)
その他使用している技術:hibernate など
発生している問題・エラー
mysqlを使用したデータの登録、参照、削除などが可能なwebアプリケーション(アプリA)を作成中です。
現状はローカル環境では、動作が上手くいっています。が、ec2にデプロイしたところエラーが発生しています。
ec2にアプリケーションを配置し、rds内のmysqlに接続する構成です。
データの登録時に下記エラーが出ます。
HTTPステータス 500 – Internal Server Error
タイプ 例外報告
メッセージ [PersistenceUnit: hotel_booking_system] Unable to build Hibernate SessionFactory
説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。
例外
javax.persistence.PersistenceException: [PersistenceUnit: hotel_booking_system] Unable to build Hibernate SessionFactory
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:970)
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:895)
org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
utils.DBUtil.getEntityManagerFactory(DBUtil.java:16)
utils.DBUtil.createEntityManager(DBUtil.java:12)
controllers.login.LoginServlet.doPost(LoginServlet.java:57)
javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
filters.EncodingFilter.doFilter(EncodingFilter.java:40)
根本原因
org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123)
org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77)
org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:128)
org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:300)
org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:460)
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:892)
org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
utils.DBUtil.getEntityManagerFactory(DBUtil.java:16)
utils.DBUtil.createEntityManager(DBUtil.java:12)
controllers.login.LoginServlet.doPost(LoginServlet.java:57)
javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
filters.EncodingFilter.doFilter(EncodingFilter.java:40)
根本原因
org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:91)
org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:116)
org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:385)
org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:519)
org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:124)
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96)
org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77)
org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:128)
org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:300)
org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:460)
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:892)
org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
utils.DBUtil.getEntityManagerFactory(DBUtil.java:16)
utils.DBUtil.createEntityManager(DBUtil.java:12)
controllers.login.LoginServlet.doPost(LoginServlet.java:57)
javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
filters.EncodingFilter.doFilter(EncodingFilter.java:40)
根本原因
java.lang.reflect.InvocationTargetException
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:88)
org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:116)
org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:385)
org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:519)
org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:124)
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96)
org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77)
org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:128)
org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:300)
org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:460)
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:892)
org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
utils.DBUtil.getEntityManagerFactory(DBUtil.java:16)
utils.DBUtil.createEntityManager(DBUtil.java:12)
controllers.login.LoginServlet.doPost(LoginServlet.java:57)
javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
filters.EncodingFilter.doFilter(EncodingFilter.java:40)
根本原因
java.lang.NullPointerException: Cannot invoke "java.lang.reflect.AccessibleObject.setAccessible(boolean)" because "ao" is null
javassist.util.proxy.SecurityActions.setAccessible(SecurityActions.java:103)
javassist.util.proxy.DefineClassHelper.toClass3(DefineClassHelper.java:151)
javassist.util.proxy.DefineClassHelper.toClass2(DefineClassHelper.java:134)
javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:95)
javassist.util.proxy.FactoryHelper.toClass(FactoryHelper.java:131)
javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:530)
javassist.util.proxy.ProxyFactory.createClass2(ProxyFactory.java:515)
javassist.util.proxy.ProxyFactory.createClass1(ProxyFactory.java:451)
javassist.util.proxy.ProxyFactory.createClass(ProxyFactory.java:422)
org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.postInstantiate(JavassistProxyFactory.java:75)
org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:162)
org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:156)
org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:58)
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:88)
org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:116)
org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:385)
org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:519)
org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:124)
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96)
org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77)
org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:128)
org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:300)
org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:460)
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:892)
org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
utils.DBUtil.getEntityManagerFactory(DBUtil.java:16)
utils.DBUtil.createEntityManager(DBUtil.java:12)
controllers.login.LoginServlet.doPost(LoginServlet.java:57)
javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
filters.EncodingFilter.doFilter(EncodingFilter.java:40)
DB周りで関係のありそうなソースコード
アプリAのソースコード
resources/META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="hotel_booking_system" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>models.Guest</class>
<class>models.Booking</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://<DB接続先>?reconnect=true&useSSL=false&useUnicode=true&characterSetResults=utf8"/>
<property name="javax.persistence.jdbc.user" value="<ユーザ名>"/>
<property name="javax.persistence.jdbc.password" value="<パスワード>"/>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
GuestsCreateServlet.java(DB登録クラス)
package controllers.guests;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.List;
import javax.persistence.EntityManager;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import models.Guest;
import models.validators.GuestValidator;
import utils.DBUtil;
import utils.EncryptUtil;
/**
* Servlet implementation class GuestsCreateServlet
*/
@WebServlet("/guests/create")
public class GuestsCreateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public GuestsCreateServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String _token = request.getParameter("_token");
if (_token != null || _token.equals(request.getSession().getId())) {
EntityManager em = DBUtil.createEntityManager();
Guest g = new Guest();
g.setName(request.getParameter("name"));
g.setPassword(
EncryptUtil.getPasswordEncrypt(
request.getParameter("password"),
(String) this.getServletContext().getAttribute("pepper")));
g.setPhone(request.getParameter("phone"));
g.setMail(request.getParameter("mail"));
Timestamp currentTime = new Timestamp(System.currentTimeMillis());
g.setCreated_at(currentTime);
g.setUpdated_at(currentTime);
g.setAdmin_flag(1);
List<String> errors = GuestValidator.validate(g, true);
if (errors.size() > 0) {
em.close();
request.setAttribute("_token", request.getSession().getId());
request.setAttribute("guest", g);
request.setAttribute("errors", errors);
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/guests/new.jsp");
rd.forward(request, response);
} else {
em.getTransaction().begin();
em.persist(g);
em.getTransaction().commit();
em.close();
request.getSession().setAttribute("flush", "登録を完了致しました。");
response.sendRedirect(request.getContextPath() + "/new/or/login");
}
}
}
}
DBUtil.java(DBユーティリティクラス)
package utils;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class DBUtil {
private static final String PERSISTENCE_UNIT_NAME = "<DB名>";
private static EntityManagerFactory emf;
public static EntityManager createEntityManager() {
return getEntityManagerFactory().createEntityManager();
}
private static EntityManagerFactory getEntityManagerFactory() {
if(emf == null){
emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
}
return emf;
}
}
自分で試したこと
ec2とRDSの接続が上手くいっていないのか、確認したところ接続はできました。
やはりアプリケーションに問題があるようです。
どうすれば、解決できるでしょうか???
0 likes