2017-01-09 5 views
0

私はSpringデータベースのJpaを、埋め込まれたH2データベースを持つスタンドアロンのGUI(Swing)Javaアプリケーションで使用します。Springブート - 組み込みデータベースへのトランザクションを永続的に維持します

私は春のブート1.3.0を使用し、これは私の追加設定です:spring.aop.proxy-target-class=true:私は唯一のラインを持っている私のapplication.propertiesファイルで

private static final String dataSourceUrl = "jdbc:h2:./databse;DB_CLOSE_ON_EXIT=FALSE"; 
    @Bean 
    public DataSource dataSource() { 
     return DataSourceBuilder.create().url(dataSourceUrl).username("user").password("pwd").build(); 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { 
     LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(dataSource); 
     em.setPackagesToScan(new String[] { "packages.to.scan" }); 

     JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     em.setJpaVendorAdapter(vendorAdapter); 

     Properties properties = new Properties(); 
     properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); 
     properties.setProperty("hibernate.hbm2ddl.auto", "update"); 
     em.setJpaProperties(properties); 

     return em; 
    } 

私のリポジトリのために私はJpaRepositoryを拡張します。

私が最近した唯一の問題はすべて動作しています。アプリケーションを実行していたMACでは、MACに何らかの問題があり、クラッシュしました。その後、以前に行われた変更は実際にデータベースに格納されませんでした。私は@Transactional注釈を使用して、データベース内のデータを変更します。

私はデータベースに慣れていませんが、グーグルではトランザクションは永続コンテキスト(用語が正しいかどうかは不明です)によってキャッシュされ、アプリケーションが終了すると実際に永続化されると思います。私は、データベースファイルをチェックし、いくつかのクエリを含むGUIを介していくつかの操作を行いましたが、データベースファイルの変更日は、アプリケーションを閉じたときにのみ変更されました。

これはスタンドアロンのGUIアプリケーションであるため、すべてのトランザクションがデータベースに直接格納されているとパフォーマンスの問題は発生しません。私は正しい方法で、どのようにしてすべてのトランザクションがデータベースに直接永続化されるのだろうか?リポジトリのsave()メソッドを呼び出すたびにコードを追加する必要がありますか?

ない場合、私は私が実際にボンネットの下に起こっていただきました!私はかなりよく分からないことを認めざるを得ないとしてこの種の問題をデバッグする方法を絶対にないアイデアを持っていません。..

+0

変更はデータベーストランザクションはコミットされ、フラッシュされました。後者は通常、トランザクションが終了してから少し時間がかかります。アプリケーションを停止したときではありません。あなたのトランザクションの境界がそれほど大きくないことを確認しましたか?アプリケーション全体に対して1つのトランザクションしか使用しない場合、おそらくアプリケーションを停止する場合にのみコミットされます。 – dunni

+0

少なくとも、アプリケーション全体で1つのトランザクションを意図的に使用していません。いくつかの関数 'propagation = Propagation.REQUIRES_NEW'を追加し、GUIでこの関数を呼び出していますが、結果は同じです:データベースファイルはアプリケーションを閉じると変更されます。 – Semaphor

答えて

0

Hibernateはそれ自身で決定最適化パラメータと設定されたフラッシング戦略に基づいてデータベースに書き込む(永続コンテキストをフラッシュする)。

たぶん、あなたはあなたのニーズに応じて、ここで見てみると動作を調整することができます。フラッシュモードについて

https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch03.html

情報もお手伝いを致します。

http://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/FlushMode.html

0

スプリングス@トランザクションは、コンテナ管理のトランザクション・パラダイムに従います。デフォルトでは、@Transactionalが別のComponentset/service/repository内の@Transactionalメソッドを呼び出すと、そのトランザクションが伝播されます。一番外側の@Transactionalメソッドが完了すると、トランザクションはデータベースにコミットされます。

JPAは、同じトランザクション内で複数回データベースにデータをフラッシュできますが、トランザクションが完了すると、トランザクション内のすべてがコミットまたはロールバックされます。 @Controlleralを@Controllerに設定している場合、DispatchServletがハンドラメソッドを呼び出した後でトランザクションが完了します(具体的には、Spring AOPを使用して作成されたGCLIBまたはJDKプロキシで行われます)

関連する問題