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;するとこの例外も出なくなる。
もうちょっとわかりやすい例外名だとすぐにピンと来るのに。。。