2012-04-04 16 views
12

私はDAOを単体でテストしています。私はJPA + Hibernateを使用しています。機能は休止状態からサポートされていません

<dependency> 
    <groupId>hsqldb</groupId> 
    <artifactId>hsqldb</artifactId> 
    <version>1.8.0.10</version> 
    <scope>test</scope> 
</dependency> 

そして、ここでは私のユニットテストのための私のpersistence.xmlです:

<persistence-unit name="unit-test-pu" transaction-type="RESOURCE_LOCAL"> 
     <properties> 
     <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/> 
     <property name="javax.persistence.jdbc.user" value="sa"/> 
     <property name="javax.persistence.jdbc.password" value=""/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:testdb"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> 
     <property name="hibernate.archive.autodetection" value="class"/> 
     <property name="hibernate.show_sql" value="true"/> 
     <property name="hibernate.use_sql_comments" value="true"/> 
     <property name="hibernate.format_sql" value="true"/> 
     <property name="hibernate.hbm2ddl.auto" value="create"/> 
     </properties>  
    </persistence-unit> 

は、これは私のテストクラスである:

私は、次のHSQLDBのバージョンを使用しています私のテストのために

@ContextConfiguration("/spring/test-context.xml") 
@TestExecutionListeners({TransactionalTestExecutionListener.class}) 
@Transactional 
public class BaseDaoTestCase extends AbstractJUnit4SpringContextTests { 

    @Autowired 
    private MockEntityDao dao; 

    @Test 
    public void testSave_success() { 
     MockEntity e = new MockEntity(); 
     dao.save(e); 
     assertNotNull(e.getId()); 
    } 
} 

注:アイデアは、メモリ内のHSQLDBインスタンスに対してDAOをテストすることです。各テストメソッドは、春に管理されるトランザクション内で実行されます。残念ながら

、私はこれを実行したときに、私は休止状態から次の例外を取得:

Caused by: org.hibernate.exception.GenericJDBCException: This function is not supported 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 
    at org.hibernate.engine.jdbc.internal.proxy.ConnectionProxyHandler.continueInvocation(ConnectionProxyHandler.java:146) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 
    at $Proxy23.prepareStatement(Unknown Source) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$2.doPrepare(StatementPreparerImpl.java:105) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:166) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:103) 
    at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:55) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2764) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3275) 
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362) 
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:203) 
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:183) 
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:167) 
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:320) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:126) 
    at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:78) 
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:757) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:732) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:736) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:854) 
    ... 42 more 
Caused by: java.sql.SQLException: This function is not supported 
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.Util.notSupported(Unknown Source) 
    at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.hibernate.engine.jdbc.internal.proxy.ConnectionProxyHandler.continueInvocation(ConnectionProxyHandler.java:138) 
    ... 67 more 

私のDAOのsave(の実現)方法は以下の通りです:

entityManager.persist(entity); 

私が使用していますハイバネーションバージョンの後:

誰もが何が起こっているのか手掛かりを持っていますか?

答えて

27

私にも同様の問題がありました。私の依存関係(特にhsqldb)を更新した後:

<hibernate-core-version>4.1.5.Final</hibernate-core-version> 
    <spring.version>3.1.2.RELEASE</spring.version> 
    <hsqldb.version>2.2.8</hsqldb.version> 
    ... 
    <dependency> 
     <groupId>org.hsqldb</groupId> 
     <artifactId>hsqldb</artifactId> 
     <version>${hsqldb.version}</version> 
    </dependency> 

私の問題は解決しました。

+0

@AntonBessovon thx!これも私の問題でした – Eugene

+0

私はpomに古代のHSQLのversonを持っていました。最新バージョンはうまく動作します –

+0

これは動作します。ありがとう –

0

あなたはどのモックフレームワークを使用していますか?私はちょうど野生の推測ですが、あなたがモックを初期化するために必要なすべてを済ませていることを確認するように、モックを使って作業することを学んでいます。多分、問題はテストのセットアップ方法と関係があります。

-1

私は、JPA + Hibernate + HSQLDBと同じ問題を抱えていますが、春はしていません。 は、ここに私のコードです:私は同じThis function is not supported例外をスロー

EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit"); 
EntityManager em = emf.createEntityManager(); 
EntityTransaction tr = em.getTransaction(); 
tr.begin(); 
em.persist(new MyEntity()); 
tr.commit(); 
em.close(); 
emf.close(); 

が、私はトランザクションなしでそれを行う場合、それはしていません。このように:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit"); 
EntityManager em = emf.createEntityManager(); 
em.persist(new MyEntity()); 
em.close(); 
emf.close(); 

今の問題は、私は変更がデータベースに反映されないということです。

+1

フィードバックをいただきありがとうございますが、最新バージョンのhsqldbを使用してこの問題を解決することができました。私が知っていることは、私が使用したhsqldbのバージョンが、休止状態で使われていたいくつかの機能を実装していないということでした。 –

+0

btwは、サービスメソッドでトランザクションをまだ設定していないため、データベースに変更が反映されていない可能性があります。トランザクションがコミットされると、Hibernateは変更をフラッシュします。サービスメソッドをトランザクション型に構成する場合を除き、休止状態はデータベースに送信されません。 –