web-dev-qa-db-ja.com

Spring JPA:Save()メソッドはデータベースにデータをコミットする必要がありますか?

私のプロジェクトでは_Spring data_を使用していますが、_extends CRUD Repository_という標準Repositoryを使用しています。

私のコードは期待どおりに機能していますが、repository.save()を呼び出すと、データベースがnot変更されますか?

データベースを変更するために、この後にcommitを呼び出す必要もありますか?または、repository.save()メソッドはデータベースを自動的に変更する必要がありますか?

12
java123999

アプリケーションが実行されると、スレッドに関連付けられたエンティティマネージャーが変更または追加されたオブジェクトの制御を保持します。save()メソッドはこれを実行するだけで、「データベースに保存する必要があります」というマークです。

データベースDML(挿入、更新、削除)は、保存中はデータベースに送信されません。コミット直前の最後に行われ、最後の瞬間まで遅延されます。

Entity Managerのflush()メソッドを使用して、いつでもDMLをデータベースに送信することが可能です。実際、データベースログをデバッグしてクエリの実行を確認できますが、データベースへのこの変更はDB接続内でのみ表示されますコミットが発行されるまで; commit()は、エンティティマネージャーに関連付けられたトランザクションのメソッドです。

Play 1.4.xなどの一部のフレームワークでは、応答ビューが正しく解析およびレンダリングされた後にコミットが発行されます。

バイ、ハンス

5
Hans Poo

このように設定すると

<tx:annotation-driven />
<jpa:repositories base-package="com.greg" />

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" />
</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.greg" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
        </props>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

次に、@ Transactionアノテーションが付けられたメソッドは、例外がスローされない場合にトランザクションを開始してコミットします。

0
Essex Boy