hibernate: 開発環境からデプロイしたらHibernate Exception - Transaction not successfully started と出た。
開発マシンから別の環境にデプロイ(サーバー上のTOMCATに)したら、webapps自体にはちゃんと配備できてブラウザからアクセスできる。
しかしデータベースとのアクセスのところになると、こんなエラーが。
Mar 31, 2008 10:06:24 AM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet Login Servlet threw exception org.hibernate.TransactionException: Transaction not successfully started at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:149) at mycompany.db.DbActionProcessor.dbAction(Unknown Source) at myproject.AdminSiteControllerServlet.dbAction(Unknown Source) at myproject.LoginServlet.findMatchingAdministrator(Unknown Source) at myproject.LoginServlet.doPost(Unknown Source) at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:568) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:595)
結論から言うと、このhibernate.cfgの設定ではデータベースにアクセスする権限がありませんよ、ということらしい。
hibernate.mysql.local.cfgを開いて、connection.usernameとconnection.passwordを使ってコマンドラインからMySQLクライアントに入れるかチェックしてみよう。たぶん入れないはず。
<hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost/dbname</property> <property name="connection.username">user</property> <property name="connection.password">password</property> <!-- Probably this is what we want to do... --> <property name="connection.useUnicode">true</property> <property name="connection.characterEncoding">UTF-8</property> <property name="connection.zeroDateTimeBehavior">convertToNull</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">false</property> <property name="hbm2ddl.auto">validate</property> </session-factory> </hibernate-configuration>
そこで、mysqlというテーブルにエントリーを追加して、このhibernate.cfgの設定でもDBにアクセスできるようにしてやろう。
insert into db values ('%', 'db_name', 'db_user', 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); insert into db values ('localhost', 'db_name', 'db_user', 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
あ、あとmysql.userテーブルにもエントリーが必要ですね。
で、flush privileges;するとこの例外も出なくなる。
もうちょっとわかりやすい例外名だとすぐにピンと来るのに。。。