2016-10-20 40 views
1

SpringとHibernateを自動的に生成したデータベースで使用しています(JPA構成プロパティで"hibernate.hbm2ddl.auto""update"に設定しています)。Spring起動時にネイティブSQLクエリを実行する

また、@Configuration@PostConstructという名前のクラスがあり、データベースの作成または更新後にアプリケーションの起動時に呼び出されます。これは、空の場合(最初の起動時)にデフォルトのデータでデータベースをセットアップするところです。

この時点で、いくつかのカスタムネイティブSQLクエリを実行したいと考えています。これらのクエリは何も返されません。追加のインデックスや拡張機能を作成するなどの設定だけです。

現在、私は新しいハイバーネートSessionを作成するためにSessionFactoryを作成することに固執しています。私は、自動配線にそれを試してみたが、それは動作しません:

@Autowired 
SessionFactory sessionFactory; 

は私を与える:Field sessionFactory in ... required a bean of type 'org.hibernate.SessionFactory' that could not be found.

私はおそらく他の場所でそれを設定する必要がありますが、私がどこかわからないことを理解しています。いくつかの答えはxmlの設定ファイルを使用していますが、設定ファイルは使用していませんので、私はそうすることはできません。

Springが適切な設定でSessionFactoryを作成する方法はありますか?

+0

「セッション」はJPAとまったく関係がありません。 –

答えて

2

:あなたが本当に休止状態Session必要とJPA 2.1を使用して使用している場合

@PersistenceContext 
EntityManager entityManager; 

SessionはとしてEntityManagerから入手することができますSessionFactoryにアクセスする必要はありません。スクリプトをsrc/main/resources/scripts/myscript.sqlファイルに入れてください。

@Component 
public class Startup { 

    @Autowired 
    private DataSource dataSource; 

    @PostConstruct 
    public void runNativeSql() { 
     ClassPathResource resource = new ClassPathResource("scripts/myscript.sql"); 
     try(Connection connection = dataSource.getConnection()) { 
      ScriptUtils.executeSqlScript(connection, resource); 
     } catch (SQLException | ScriptException e) { 
      //LOG 
     } 
    } 
} 
+0

これはまさに私がやりたかったことです。 – deadbeef

0

としてあなたはJPA EntityManagerをautowireすることができます

entityManager.unwrap(Session.class); 
+0

これは私のためには機能しませんでした。Beanの作成中に例外が発生しました: 'java.lang.IllegalStateException:利用可能なトランザクションEntityManagerはありません。 ' – deadbeef

関連する問題