2012-06-03 11 views
5

Como sugiere el título, me sale un error al ejecutar Play 2.0.1 Tests usando una aplicación Fake w/H2 en la memoria.Play Framework: Error al obtener la secuencia nextval usando la base de datos en memoria H2

puedo configurar una prueba de unidad básica:

public class ModelTest { 
    @Test 
    public void checkThatIndustriesExist() { 
     running(fakeApplication(inMemoryDatabase()), new Runnable() { 
      public void run() { 
       Industry industry = new Industry(); 
       industry.name = "Some name"; 
       industry.shortname = "some-name"; 
       industry.save(); 
       assertThat(Industry.find.all()).hasSize(1); 
      } 
     }); 
    } 

que produce la siguiente excepción:

[info] test.ModelTest 
[error] Test test.ModelTest.checkThatIndustriesExist failed: Error getting sequence nextval 
[error]  at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.getMoreIds(SequenceIdGenerator.java:213) 
[error]  at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.loadMoreIds(SequenceIdGenerator.java:163) 
[error]  at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.nextId(SequenceIdGenerator.java:118) 
[error]  at com.avaje.ebeaninternal.server.deploy.BeanDescriptor.nextId(BeanDescriptor.java:1218) 
[error]  at com.avaje.ebeaninternal.server.persist.DefaultPersister.setIdGenValue(DefaultPersister.java:1304) 
[error]  at com.avaje.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:403) 
[error]  at com.avaje.ebeaninternal.server.persist.DefaultPersister.saveEnhanced(DefaultPersister.java:345) 
[error]  at com.avaje.ebeaninternal.server.persist.DefaultPersister.saveRecurse(DefaultPersister.java:315) 
[error]  at com.avaje.ebeaninternal.server.persist.DefaultPersister.save(DefaultPersister.java:282) 
[error]  at com.avaje.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1577) 
[error]  at com.avaje.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1567) 
[error]  at com.avaje.ebean.Ebean.save(Ebean.java:538) 
[error]  at play.db.ebean.Model.save(Model.java:76) 
[error]  at test.ModelTest$1.run(ModelTest.java:24) 
[error]  at play.test.Helpers.running(Helpers.java:277) 
[error]  at test.ModelTest.checkThatIndustriesExist(ModelTest.java:21) 
[error]  ... 
[error] Caused by: org.h2.jdbc.JdbcSQLException: Syntax Fehler in SQL Befehl "SELECT INDUSTRY_SEQ.NEXTVAL UNION[*] SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL "; erwartet "identifier" 
[error] Syntax error in SQL statement "SELECT INDUSTRY_SEQ.NEXTVAL UNION[*] SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL "; expected "identifier"; SQL statement: 
[error] select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval [42001-158] 
[error]  at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) 
[error]  at org.h2.message.DbException.get(DbException.java:169) 
[error]  at org.h2.message.DbException.getSyntaxError(DbException.java:194) 
[error]  at org.h2.command.Parser.readColumnIdentifier(Parser.java:2777) 
[error]  at org.h2.command.Parser.readTermObjectDot(Parser.java:2336) 
[error]  at org.h2.command.Parser.readTerm(Parser.java:2453) 
[error]  at org.h2.command.Parser.readFactor(Parser.java:2035) 
[error]  at org.h2.command.Parser.readSum(Parser.java:2022) 
[error]  at org.h2.command.Parser.readConcat(Parser.java:1995) 
[error]  at org.h2.command.Parser.readCondition(Parser.java:1860) 
[error]  at org.h2.command.Parser.readAnd(Parser.java:1841) 
[error]  at org.h2.command.Parser.readExpression(Parser.java:1833) 
[error]  at org.h2.command.Parser.parseSelectSimpleSelectPart(Parser.java:1746) 
[error]  at org.h2.command.Parser.parseSelectSimple(Parser.java:1778) 
[error]  at org.h2.command.Parser.parseSelectSub(Parser.java:1673) 
[error]  at org.h2.command.Parser.parseSelectUnion(Parser.java:1518) 
[error]  at org.h2.command.Parser.parseSelect(Parser.java:1506) 
[error]  at org.h2.command.Parser.parsePrepared(Parser.java:405) 
[error]  at org.h2.command.Parser.parse(Parser.java:279) 
[error]  at org.h2.command.Parser.parse(Parser.java:251) 
[error]  at org.h2.command.Parser.prepareCommand(Parser.java:217) 
[error]  at org.h2.engine.Session.prepareLocal(Session.java:415) 
[error]  at org.h2.engine.Session.prepareCommand(Session.java:364) 
[error]  at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1119) 
[error]  at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:71) 
[error]  at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:267) 
[error]  at com.jolbox.bonecp.ConnectionHandle.prepareStatement(ConnectionHandle.java:820) 
[error]  at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.getMoreIds(SequenceIdGenerator.java:193) 
[error]  ... 80 more 

Mi modelo es el siguiente:

@Entity 
@Table(name = "industry") 
public class Industry extends Model { 
    @Id public Long id; 
    public String name; 
    public String shortname; 

    // called in the view to trigger lazy-loading 
    public String getName() { 
     return name; 
    } 

    public static Finder<Long, Industry> find = new Finder<Long, Industry>(Long.class, Industry.class); 
} 

... y, finalmente, la parte relevante de mi evolución inicial:

create table industry (
    id  bigint not null, 
    name  varchar(255), 
    shortname varchar(255), 
    constraint pk_industry primary key (id) 
} 

create sequence industry_seq start with 1000; 

Todo funciona bien en mi base de datos PostgreSQL, y desde mi punto de vista el código no es diferente del Play2.0 Computer Database Sample.

Estoy feliz por cualquier ayuda, ¡gracias!

Saludos, Alex

Respuesta

5

Resuelto el problema, se hace así:

  • antes de llamar a base de datos en memoria() proporcioné mi propia configuración
  • el nombre de la base de datos era 'prueba' y no 'predeterminado' como se usa llamando a inMemoryDatabase()
  • ya que no mantuve las evoluciones en conf/evolutions/test pero solo en conf/evolutions/default el esquema hasn 't sido creado
  • tuve que limpiar la aplicación, como la 'configuración por defecto' no se aplicó después del cambio de base de datos en memoria()
+0

Por favor acepte su respuesta. (para las estadísticas;)) –

+0

Lo haré; Necesito esperar otras 23 horas hasta que se me permita hacerlo. – alexhanschke

3

Simplemente usando su código y una nueva obra 2.0.1 proyecto no podía reproducirse. Aquí está mi código y configuración con importaciones. Como las clases no son el problema, supongo que desconectó las evoluciones con evolutionplugin=disabled y la evolución de su base de datos nunca se aplica, de ahí el "identificador esperado" en su excepción.

Editar deshabilitar las evoluciones de la base de datos, como se indicó anteriormente, produce la misma excepción que ha encontrado, ver en la parte inferior.

Edit-2 El autor de this blogpost describe cómo aplicar las evoluciones a mano. No se ve muy sexy, pero yo solo debería implementar esa clase base una vez por proyecto. Si alguien sabe algo más elegante dentro del marco, dígaselo.

El Ebean Evolución (generado automáticamente):

create table industry ( 
    id    bigint not null, 
    name   varchar(255), shortname     
    varchar(255), constraint pk_industry primary key (id)) ; 
    create sequence industry_seq; 
; 

Mi models.Industry

package models; 

import play.db.ebean.Model; 

import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name = "industry") 
public class Industry extends Model { 
    @Id 
    public Long id; 
    public String name; 
    public String shortname; 

    // called in the view to trigger lazy-loading 
    public String getName() { 
     return name; 
    } 

    public static Finder<Long, Industry> find 
      = new Model.Finder<Long, Industry>(Long.class, Industry.class); 
} 

mi unidad de prueba-

package models; 

import org.junit.Test; 

import java.util.List; 
import java.util.Map; 

import static org.fest.assertions.Assertions.assertThat; 
import static play.test.Helpers.fakeApplication; 
import static play.test.Helpers.inMemoryDatabase; 
import static play.test.Helpers.running; 

public class ModelTest { 

    @Test 
    public void checkThatIndustriesExist() { 
     running(fakeApplication(inMemoryDatabase()), new Runnable() { 
      public void run() { 
       Industry industry = new Industry(); 
       industry.name = "Some name"; 
       industry.shortname = "some-name"; 
       industry.save(); 
       assertThat(Industry.find.all()).hasSize(1); 
      } 
     }); 
    } 

} 

Mi appication.conf salida

application.secret="8aXG0?h`[email protected]<v`kwouvQr2<y5Y>9jk3XU1yHV`Yr>18xRKHv8PTdv" 
application.langs="en" 
ebean.default="models.*" 
logger.root=ERROR 
logger.play=INFO 
logger.application=DEBUG 

prueba:

evoluciones
[stackoverflow-10869508] $ test 
[info] Updating {file:/Users/martin/workspace/stackoverflow-10869508/}stackoverflow-10869508... 
[info] Done updating.                 
[info] Compiling 4 Scala sources and 3 Java sources to /Users/martin/workspace/stackoverflow-10869508/target/scala-2.9.1/classes... 
[info] Compiling 1 Java source to /Users/martin/workspace/stackoverflow-10869508/target/scala-2.9.1/test-classes... 
[info] models.ModelTest 
[info] + models.ModelTest.checkThatIndustriesExist 
[info] 
[info] 
[info] Total for test models.ModelTest 
[info] Finished in 2.289 seconds 
[info] 1 tests, 0 failures, 0 errors 
[info] Passed: : Total 1, Failed 0, Errors 0, Passed 1, Skipped 0 

salida de prueba incapacitante:

[stackoverflow-10869508] $ test 
[info] Compiling 1 Java source to /Users/martin/workspace/stackoverflow-10869508/target/scala-2.9.1/test-classes... 
[info] models.ModelTest 
[error] Test models.ModelTest.checkThatIndustriesExist failed: Error getting sequence nextval 
[error]  at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.getMoreIds(SequenceIdGenerator.java:213) 
[error]  at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.loadMoreIds(SequenceIdGenerator.java:163) 
[error]  at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.nextId(SequenceIdGenerator.java:118) 
[error]  at com.avaje.ebeaninternal.server.deploy.BeanDescriptor.nextId(BeanDescriptor.java:1218) 
[error]  at com.avaje.ebeaninternal.server.persist.DefaultPersister.setIdGenValue(DefaultPersister.java:1304) 
[error]  at com.avaje.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:403) 
[error]  at com.avaje.ebeaninternal.server.persist.DefaultPersister.saveEnhanced(DefaultPersister.java:345) 
[error]  at com.avaje.ebeaninternal.server.persist.DefaultPersister.saveRecurse(DefaultPersister.java:315) 
[error]  at com.avaje.ebeaninternal.server.persist.DefaultPersister.save(DefaultPersister.java:282) 
[error]  at com.avaje.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1577) 
[error]  at com.avaje.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1567) 
[error]  at com.avaje.ebean.Ebean.save(Ebean.java:538) 
[error]  at play.db.ebean.Model.save(Model.java:76) 
[error]  at models.ModelTest$1.run(ModelTest.java:22) 
[error]  at play.test.Helpers.running(Helpers.java:277) 
[error]  at models.ModelTest.checkThatIndustriesExist(ModelTest.java:17) 
[error]  ... 
[error] Caused by: org.h2.jdbc.JdbcSQLException: Syntax Fehler in SQL Befehl "SELECT INDUSTRY_SEQ.NEXTVAL UNION[*] SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL "; erwartet "identifier" 
[error] Syntax error in SQL statement "SELECT INDUSTRY_SEQ.NEXTVAL UNION[*] SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL "; expected "identifier"; SQL statement: 
[error] select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval [42001-158] 
[error]  at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) 
[error]  at org.h2.message.DbException.get(DbException.java:169) 
[error]  at org.h2.message.DbException.getSyntaxError(DbException.java:194) 
[error]  at org.h2.command.Parser.readColumnIdentifier(Parser.java:2777) 
[error]  at org.h2.command.Parser.readTermObjectDot(Parser.java:2336) 
[error]  at org.h2.command.Parser.readTerm(Parser.java:2453) 
[error]  at org.h2.command.Parser.readFactor(Parser.java:2035) 
[error]  at org.h2.command.Parser.readSum(Parser.java:2022) 
[error]  at org.h2.command.Parser.readConcat(Parser.java:1995) 
[error]  at org.h2.command.Parser.readCondition(Parser.java:1860) 
[error]  at org.h2.command.Parser.readAnd(Parser.java:1841) 
[error]  at org.h2.command.Parser.readExpression(Parser.java:1833) 
[error]  at org.h2.command.Parser.parseSelectSimpleSelectPart(Parser.java:1746) 
[error]  at org.h2.command.Parser.parseSelectSimple(Parser.java:1778) 
[error]  at org.h2.command.Parser.parseSelectSub(Parser.java:1673) 
[error]  at org.h2.command.Parser.parseSelectUnion(Parser.java:1518) 
[error]  at org.h2.command.Parser.parseSelect(Parser.java:1506) 
[error]  at org.h2.command.Parser.parsePrepared(Parser.java:405) 
[error]  at org.h2.command.Parser.parse(Parser.java:279) 
[error]  at org.h2.command.Parser.parse(Parser.java:251) 
[error]  at org.h2.command.Parser.prepareCommand(Parser.java:217) 
[error]  at org.h2.engine.Session.prepareLocal(Session.java:415) 
[error]  at org.h2.engine.Session.prepareCommand(Session.java:364) 
[error]  at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1119) 
[error]  at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:71) 
[error]  at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:267) 
[error]  at com.jolbox.bonecp.ConnectionHandle.prepareStatement(ConnectionHandle.java:820) 
[error]  at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.getMoreIds(SequenceIdGenerator.java:193) 
[error]  ... 80 more 
[info] x models.ModelTest.checkThatIndustriesExist 
[info] 
[info] 
[info] Total for test models.ModelTest 
[info] Finished in 2.028 seconds 
[info] 1 tests, 1 failures, 0 errors 
[error] Failed: : Total 1, Failed 1, Errors 0, Passed 0, Skipped 0 
[error] Failed tests: 
[error]  models.ModelTest 
[error] {file:/Users/martin/workspace/stackoverflow-10869508/}stackoverflow-10869508/test:test: Tests unsuccessful 
[error] Total time: 3 s, completed 03.06.2012 18:34:39 
+0

Gracias por el código de prueba! De hecho, me di cuenta de que las evoluciones no se han aplicado (ver mi respuesta). – alexhanschke

3

Mis ID ven así, y yo no lo entiendo error ...

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
public Long id; 
+0

Esto lo arregló para mí, la clave es agregar la anotación @GeneratedValue –

+0

Esta debería ser la respuesta aceptada. – falmp

Cuestiones relacionadas