2012-04-04 13 views
12

DAO'ları ilkbaharda kullanarak test yapıyorum. JPA + Hazırda Bekletme'yi kullanıyorum. i aşağıdaki hsqldb sürümünü kullanıyorum benim testler içinİşlev hazırda bekletme modundan desteklenmiyor

:

: Bu benim test sınıfı

<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> 

: Burada

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

Ve birim testler için benim persistence.xml var

@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()); 
    } 
} 

Not: buradaki amaç, DAO'larımı bir bellek HSQLDB örneğine karşı test etmektir. Her test yöntemi, ilkbahar tarafından yönetilen bir işlem içinde çalışır. ben bu çalıştırdığınızda

Maalesef i hazırda aşağıdaki özel durum alıyorum:

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 

aşağıdaki benim DAO'ın kaydet() yönteminin uygulanması gibi:

entityManager.persist(entity); 

kullanıyorum Hazırda bekletme sürümünü izleyen:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>4.1.0.Final</version> 
    <scope>compile</scope> 
</dependency> 

Neler olup bittiğine dair bir ipucu var mı?

cevap

27

Benzer bir sorun yaşadım. Bağımlılıklarımı güncelleştirdikten sonra (özellikle 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> 

Sorunum çözüldü.

+0

@AntonBessovon thx! Bu benim de problemim oldu – Eugene

+0

Pommımda HSQL'in eski bir versonisi vardı. Son sürümü iyi çalışıyor –

+0

bu çalışır. Teşekkürler: D –

0

Hangi alay çerçevesini kullanıyorsunuz? Sadece sahtekarlarla çalışmayı öğreniyorum, bu yüzden bu sadece vahşi bir tahmindir, ancak sahtekarlığı başlatmak için gereken her şeyi yaptığınızdan emin olun. Belki de sorunun, testin nasıl kurulduğuyla ilgili bir şeyleri vardır.

-1

JPA + Hazırda Bekletme + HSQLDB ile çalışırken aynı sorunu yaşıyorum ama ilkbaharda değil. İşte benim kodudur: bana aynı This function is not supported istisna atar

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(); 

ama işlem olmadan bunu eğer, öyle değil. Bunun gibi:

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

Sorun şu ki, veritabanında yansıyan değişiklikleri göremiyorum.

+1

Geri bildiriminiz için teşekkürler, ancak bu sorunu hsqldb'nin en son sürümünü kullanarak çözmeyi başardım. Sorunu anlayabildiğim kadarıyla, kullandığım hsqldb sürümünün hazırda bekletme tarafından kullanılan bazı özellikleri uygulamamasıydı. –

+0

btw büyük olasılıkla, veritabanınızdaki değişiklikleri görmüyorsunuz çünkü hizmet yöntemleriniz üzerinde henüz bir işlem yapılandırmamışsınızdır. Hazırda bekletme işlemi, bir işlem gerçekleştiğinde değişikliklerinizi temizler. Hizmet yöntemlerinizi, işlem hazırda bekletme olarak yapılandırmazsanız, bunları veritabanınıza göndermez. –

İlgili konular