2

Hibernate/JPA を使用した成熟した Java アプリケーションが正常に動作しています。いくつかのユニット/統合テストを追加しようとしています。Spring の TestContext フレームワークを使用してこれを行っています。テスト クラスは次のようになります。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class ServiceTest {

    @Autowired
    private MyService myService;

    @Test
    public void testWorkspaceThing() throws Exception {

        List<MyEntity> entities = myService.someMethod();
        assertNotNull(entities);
    }
}

必要なすべてのコンテキスト構成をアプリケーション コンテキストからコピーして ServiceTest-context.xml に貼り付けました。これには、context:component-scan、dataSource の定義、entityManagerFactory Bean などが含まれます。アプリケーションの実行中、エラーは発生しません。このテストを実行すると、次のようになります。

java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: MyEntity is not mapped.

すべての Entity クラスについて、クエリを試みます。Entity クラスには、javax.persistence.Entity などのアノテーションが付けられます。

これが TestContext を使用して失敗する理由を知っている人はいますか?

アップデート

persistence.xml ファイルは基本的に空です。

<persistence-unit name="some-pu" />

したがって、注釈付きのすべてのエンティティクラスを見つけるために自動スキャンしていると思います。単体テストの実行中のフォルダー構造と、Tomcat での展開方法のディレクトリ構造の違いでしょうか? persistence.xml は WebContent/WEB-INF/classes/META-INF にあります

また、Spring 3.1 で「packagesToScan」を定義できることに気付きましたが、Spring 3.0.6.RELEASE を使用しています。

4

3 に答える 3

3

このメッセージは通常、hibernate.cfg または persistence.xml でエンティティをマップしていないことを示しています

<mapping class="com.yourpackage.MyEntity" />
...other entities

MyEntityクラスがそこにマップされ、クラス内のその注釈が正確であることを確認してください@Entity(name="MyEntity")

編集: 上記の Spring 3.1 を使用している場合は、テスト コンテキストで EntityManager ファクトリ Bean に次のように指示してみてください。

  <property name="packagesToScan">
     <list>
        <value>com.yourpackage.domain</value>
     </list>
  </property>
于 2013-05-16T20:01:03.563 に答える
2

antを介してjunitテストを実行することで機能しました。persistence.xml ファイルを build/classes/META-INF にコピーして、コンパイル済みのエンティティ クラスと同じフォルダー ツリーに配置するようにしました。これにより、スキャンが機能し、テストが正しく実行されるようになりました。

これは、persistence.xml の Webcontent/WEB-INF/classes/META-INF コピーを削除し、それを build/ フォルダーに残すと、Eclipse で機能します。Eclipseで動作させるためのより良い方法があるのだろうか.

于 2013-05-16T22:40:44.383 に答える
0

これを persistence.xml ファイルに追加してみてください。

<persistence-unit name="some-pu" transaction-type="RESOURCE_LOCAL">
<class>package.MyEntity</class>

        <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.connection.username" value="USER-DB"/>
        <property name="hibernate.connection.password" value="PASSWORD-DB"/>
        <property name="hibernate.connection.url" value="jdbc:mysql://SERVER-IP/some-pu?autoReconnect=true"/>
        <property name="hibernate.max_fetch_depth" value="3"/>

         <!-- Determines how many connections at a time c3p0 will try to acquire when the pool is exhausted. :: default=1 -->
        <property name="connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/>
        <property name="hibernate.c3p0.min_size" value="2"/>
        <property name="hibernate.c3p0.timeout" value="300"/>
        <property name="hibernate.c3p0.idle_test_period" value="300"/>
        <property name="hibernate.c3p0.acquire_increment" value="1"/> 
        <property name="hibernate.c3p0.max_size" value="10"/> 
        <property name="hibernate.c3p0.max_statements" value="50"/>     

    </properties>
</persistence-unit>

お役に立てば幸いです

于 2013-05-16T20:55:24.453 に答える