2012-06-03 7 views
5

Wie der Titel vermuten lässt, erhalte ich eine Fehlermeldung, wenn ich Play 2.0.1 Tests mit einer FakeApplication w/H2 im Speicher abspiele.Play Framework: Fehler beim Abrufen der Sequenz nextval mit der H2 In-Memory-Datenbank

stelle ich eine Basiseinheit Test auf:

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

Welche die folgende Ausnahme ergibt:

[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 

Mein Modell sieht wie folgt aus:

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

... und schließlich der relevante Teil von meiner anfänglichen Entwicklung:

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; 

Alles funktioniert einwandfrei auf meiner PostgreSQL-DB, und aus meiner Sicht unterscheidet sich der Code nicht von der Play2.0 Computer Database Sample.

Ich bin glücklich für jede Hilfe - danke!

Grüße, Alex

Antwort

5

das Problem gelöst, hier ist, wie:

  • vor In-Memory-Datenbank() aufrufen I vorgesehen meine eigene Konfiguration
  • Der Name der Datenbank war 'test' und nicht 'default' wie der Aufruf von inMemoryDatabase()
  • da ich Entwicklungen in conf/evolutions/test nicht beibehalten habe sondern nur in conf/evolutions/default das Schema hasn ‚t erstellt
  • ich die App zu reinigen hatte, wie die‚default‘config nicht nach dem Wechsel auf In-Memory-Datenbank()
+0

PLZ akzeptieren Ihre Antwort. (für die Statistik;)) –

+0

werde ich; Ich muss noch 23 Stunden warten, bis es mir erlaubt ist. – alexhanschke

3

einfach Ihren Code und eine neue Wiedergabe 2.0.1 Projekt mit Ich konnte nicht reproduzieren. Hier ist mein Code und Konfig mit Importe. Da die Klassen nicht das Problem sind, würde ich vermuten, dass Sie Entwicklungen mit ausgeschaltet haben und Ihre Datenbankentwicklung nie angewendet wird, daher der "Bezeichner erwartet" in Ihrer Ausnahme.

Bearbeiten Das Deaktivieren von Datenbankentwicklungen, wie oben beschrieben, führt zu der gleichen Ausnahme, die aufgetreten ist, siehe unten.

Edit-2 Der Autor von this blogpost beschreibt, wie Sie die Entwicklungen von Hand anwenden. Sieht nicht zu sexy aus, aber ich sollte diese Basisklasse nur einmal pro Projekt implementieren müssen. Wenn jemand etwas eleganteres innerhalb des Rahmens kennt, sag es.

Die Ebean Evolution (automatisch generiert):

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

Mein 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); 
} 

My Unit-Test

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

} 

Mein appication.conf

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

Testausgang:

[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 

Testausgang deaktivieren Evolutionen:

[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

Danke für den Testcode! Tatsächlich habe ich herausgefunden, dass die Entwicklungen nicht angewendet wurden (siehe meine Antwort). – alexhanschke

3

Meine ids wie folgt aussehen angewendet wurde, und ich habe nicht, dass Fehler ...

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

Dies hat es für mich behoben, der Schlüssel ist, die Annotation @GeneratedValue –

+0

hinzuzufügen Dies sollte die akzeptierte Antwort sein. – falmp