2016-04-25 4 views
1

私はJava Spring + Hibernateプロジェクトに取り組んでおり、コードをユニットテストするためにJunitの設定があります。 私が今直面している問題は、テストが実際に実行される前にHibernateが(スプリングブートを使用して)データベーススキーマを2回作成する理由を理解できないことです。次のように順序は次のとおりです。 Junit Hibernateはデータベーススキーマを複数回作成します

  • アルターテーブルが
  • アルターテーブルは、すべての外部キーをドロップ(FKのような)制約を追加テーブルを作成して存在する場合

    1. アルターテーブルには、すべての外部キーに
    2. ドロップテーブルをドロップ
    3. 存在する場合はドロップテーブル
    4. テーブルを作成する
    5. 変更テーブルには、 straints
    6. は、すべてのテスト

    私の質問を実行し、より具体的には場合は、次のとおりです。ポイント3-6を含むが実行されているのはなぜ? なぜ1,2,7,8,9を実行しないのか?なぜ私はこれをしたいですか?それは貴重な時間がかかるため、なぜ私はこれを必要としているのか分かりません。

    以下

    は私の永続性構成である:また、以下の

    <persistence-unit name="localContainerEntityForTest"> 
        <description>Spring JPA LocalContainerEntityManagerFactoryBean</description> 
        <provider>org.hibernate.ejb.HibernatePersistence</provider> 
        <properties> 
         <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
         <property name="hibernate.hbm2ddl.auto" value="create"/> 
         <property name="hibernate.implicit_naming_strategy" value="legacy-jpa"/> 
         <property name = "hibernate.show_sql" value = "true" /> 
         <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
         <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/myApp?createDatabaseIfNotExist=true"/> 
         <property name="javax.persistence.jdbc.user" value="hibernate"/> 
         <property name="javax.persistence.jdbc.password" value="password"/> 
        </properties> 
    </persistence-unit> 
    

    は、私はすべてのユニットテストクラスで使用注釈です:

    @RunWith(SpringJUnit4ClassRunner.class) 
    @SpringApplicationConfiguration(classes = JPAConfigurationTestEnviorement.class) 
    @WebAppConfiguration 
    @FixMethodOrder(MethodSorters.NAME_ASCENDING) 
    
  • 答えて

    0

    問題が見つかりました。春のブートバージョンをアップグレードするプロセスを開始した後、私はこれまで何も言わなかった奇妙なコードを見ました。その理由は、LocalContainerEntityManagerBeanを定義する前のEntityManagerFactoryの作成をした:

    @Bean 
    public LocalContainerEntityManagerFactoryBean getEntityManagerFactoryBean() { 
        Persistence.createEntityManagerFactory("localContainerEntityForTest"); 
    
        LocalContainerEntityManagerFactoryBean lcemfb = new LocalContainerEntityManagerFactoryBean(); 
        lcemfb.setPersistenceUnitName("localContainerEntityForTest"); 
        lcemfb.setPackagesToScan("com.mybasepackage"); 
        lcemfb.setPersistenceXmlLocation("classpath:/META-INF/persistence.xml"); 
    
        return lcemfb; 
    } 
    

    ラインを除去した後:サイクルが消え

    Persistence.createEntityManagerFactory("localContainerEntityForTest"); 
    

    0

    私はHibernateでかなりお馴染みですが、それほど春にブート。私の推測では、Hibernateは1つのcreate-alter-dropサイクルを直接担当し、もう1つはSpring Bootが担当しています。 validateオプションを選択することにより

    <property name="hibernate.hbm2ddl.auto" value="validate"/> 
    

    は、あなただけの既存のスキーマを検証するために休止状態に指示されており、作成しないためにか:あなたは道徳的に自分の現在の設定に反対している場合は、次のようにあなたのHibernateのXMLを更新してみてくださいテーブルを削除します。ここでのトリックは、2つのサイクルのどちらを削除したいのかわからないということです。

    +0

    1.私はjunit自身でデータベースを作成したいので、作成はOKです。 2.スプリングブートロゴはすべての1-9ステップの直前に表示されるので、サイクルの責任に関して正しいと思うなら、ロゴが表示された後にこれらが混在していると思います。 3.実際のアプリケーションの実行(Debug-As、Run-As)にvalidateを使用します。4.削除するサイクルについては、ここで2に依存します。また、可能な場合は区別し、除外することを知りたいと思っています。 – XMight

    +0

    私は現時点では弾丸になっていませんが、他の人に完全な答えを与えるよう促すために、この回答を少し残しておきます。 –

    関連する問題