2012-04-04 13 views
12

Pruebo unitario de mis DAO con la primavera. Estoy usando JPA + Hibernate.Función no admitida desde la hibernación

Para mis pruebas que estoy usando la siguiente versión hsqldb:

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

Y aquí es mi persistence.xml para mis pruebas de unidad:

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

Ésta es mi clase de prueba:

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

Nota: la idea es probar mis DAO contra una instancia HSQLDB en memoria. Cada método de prueba se ejecuta dentro de una transacción administrada por la primavera.

Por desgracia, cuando funciono esta me sale el siguiente excepción de hibernación:

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 

La aplicación del método de mi DAO Save() es la siguiente:

entityManager.persist(entity); 

estoy usando el siguiente versión de hibernación:

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

¿Alguien tiene alguna pista sobre lo que está pasando?

Respuesta

27

Tuve un problema similar. Después de actualizar mis dependencias (especialmente hsqldb) a:

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

mi problema está resuelto.

+0

@AntonBessovon thx! este era mi problema también – Eugene

+0

Tenía una versión antigua de HSQL en mi pom. La última versión funciona bien –

+0

esto funciona. Gracias: D –

0

¿Qué marco de burla estás usando? Estoy aprendiendo a trabajar con los simuladores, así que esto es solo una suposición descabellada, pero asegúrate de haber hecho todo lo necesario para inicializar el simulacro. Tal vez el problema tiene algo que ver con la forma en que se está configurando la prueba.

-1

Estoy teniendo el mismo problema al trabajar con JPA + Hibernate + HSQLDB, pero no con la primavera. Aquí está mi código:

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

Eso me lanza el mismo This function is not supported excepción, pero si lo hago sin la transacción, no lo hace. De esta manera:

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

El problema ahora es que no veo los cambios reflejados en la base de datos.

+1

Gracias por los comentarios, pero he logrado resolver este problema utilizando la última versión de hsqldb. Por lo que puedo entender, el problema fue que la versión de hsqldb que utilicé no implementó algunas funciones utilizadas por hibernate. –

+0

Por cierto, es probable que no vea los cambios en la base de datos porque aún no ha configurado una transacción en sus métodos de servicio. Hibernate eliminará sus cambios una vez que se haya comprometido una transacción. A menos que configure sus métodos de servicio para que sean hibernadores transaccionales, no los enviará a su base de datos. –

Cuestiones relacionadas