2011-01-10 19 views
20

私は、MySQLデータベース上でHibernateでSpringを使用するアプリケーションを持っています。何らかの理由で、最後の数日間、私は次のようなエラーになっています私のデータベースに任意のオブジェクトを永続化しようといつの通り:なぜこれが起こっているなぜこのHibernate MySQL Connectionは読み取り専用ですか?

java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed.*

を私は私の人生のために把握することはできません。私のアプリケーションは数日前に問題なく動作していました。

私はこのように私のapplicationContext.xmlをファイルにSessionFactoryのオブジェクトを設定しています:

 <bean id="sessionFactory" lass="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="configLocation" 
value="classpath:/hibernate.cfg.xml"/> 
     <property name="packagesToScan"> 
      <list> 
       <value>com.domain.domainObjects</value> 
      </list> 
     </property> 
    </bean> 

私のhibernate.cfg.xmlファイルは次のようになります。私は、MySQLを使用しています

<?xml version='1.0' encoding='utf-8'?> 

<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <!-- Database connection settings --> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql://{url to db}:3306/{db name}</property> 
     <property name="connection.username">{db user}</property> 
     <property name="connection.password">{db password}</property> 
     <!-- JDBC connection pool (use the built-in) --> 
     <property name="connection.pool_size">10</property> 
     <!-- SQL dialect --> 
     <property name="dialect">org.hibernate.dialect.MySQL5Dialect</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">true</property> 
     <!-- Drop and re-create the database schema on startup --> 
     <property name="hbm2ddl.auto">update</property> 

    </session-factory> 
</hibernate-configuration> 

/j conenction version 5.1、hibernate version 3.2、spring mvc 3.0.5

+0

設定が良好です。これによって影響を受けるサンプルコードも追加してください。また、MySQLドライバの正確なバージョンを指定できればうれしいでしょう。 – jpkrohling

+0

Transactionalアノテーションを使用していますか? @Transactional(readOnly = true)に設定されています –

+5

恐ろしいデバッグの約3時間後、私は今何が起こっているのか知っています。私はサービスレベルの方法を持っています。私はまた、 "周りの"アドバイスを持っています。サービスレベルのメソッドに@Transactional(readOnly = true)というアノテーションが付けられていますが、@Transactional(readOnly = false)というアノテーションが付いた別のサービスがあります。私のアスペクト(またはアドバイス)は、通常のサービスレイヤと同じDAOオブジェクトを使用しているので、sessionFactory.getCurrenctSession()を呼び出すと、読み取り専用サービスレベルメソッド用に作成されたセッションが返されます。今、私は再建築する必要があります。あなたのお返事ありがとう! –

答えて

36

あなたのケースであることを確認してください私は今何が起こっているか知っています。私はサービスレベルの方法を持っています。私はまた、 "周りの"アドバイスを持っています。サービスレベルのメソッドには@Transactional(readOnly=true)という注釈が付けられていますが、私の助言にはannotated with @Transactional(readOnly=false)という別のサービスがあります。

通常のサービスレイヤと同じDAOオブジェクトを使用しているので、sessionFactory.getCurrenctSession()と呼ぶと、私の読み取り専用サービスレベルメソッド用に作成されたセッションが返されます。今、私は再建築する必要があります。

+2

この全く同じシナリオを実行しました。 readOnly = trueメソッドM1(別のメソッドM2に呼び出しをラップしたもの、つまりreadOnly = false)がありました。興味深いことに、私たちはこれを見ているに過ぎません。 – Bradley

関連する問題