Неверный sql-скрипт, созданный для базы данных sqlite ebean в структуре Play

Я использую платформу play 2.1 и использую эволюцию для автоматического создания sql-скриптов для меня. Я использую базу данных sqlite3.

Похоже, что эволюция не может создать правильный скрипт для sqlite3. Неправильный сценарий, который я получил:

create table algorithm ( id bigint AUTOINCREMENT primary key, name varchar(255), description varchar(255)) ; 

Я новичок в sqlite3. Поиск в Интернете я понял, что:

  1. autoincrement может работать только с Integer
  2. autoincrement должен быть размещен после primary key

Поэтому очевидно, что автоматически созданный скрипт неверен. Мои вопросы:

  1. Есть ли способ исправить вышеупомянутую проблему, чтобы я мог использовать эволюцию с помощью sqlite3?
  2. В общем, вы предлагаете использовать эволюцию или отключить ее и написать скрипты sql вручную?

Вчера я столкнулся с тем же вопросом. Проблема находится внутри конфигурации sqlite ddl в структуре ebean.

Однако мне удалось решить эту проблему, создав собственную реализацию класса com.avaje.ebean.config.dbplatform.SQLitePlatform. Это быстрый хак, который устанавливает ключевое слово autoincrement в пустую строку и переопределяет тип bigint в integer:

 package com.avaje.ebean.config.dbplatform; import java.sql.Types; import javax.sql.DataSource; import com.avaje.ebean.BackgroundExecutor; public class SQLitePlatform extends DatabasePlatform { static { System.err.println("\n\n!!! Custom SQLitePlatform class for ebean ORM loaded !!!!\n\n"); } public SQLitePlatform() { super(); this.name = "sqlite"; this.dbIdentity.setIdType(IdType.IDENTITY); this.dbIdentity.setSupportsGetGeneratedKeys(false); this.dbIdentity .setSelectLastInsertedIdTemplate("select last_insert_rowid()"); this.openQuote = "\""; this.closeQuote = "\""; this.booleanDbType = Types.INTEGER; dbTypeMap.put(Types.BIT, new DbType("int default 0")); dbTypeMap.put(Types.BOOLEAN, new DbType("int default 0")); dbTypeMap.put(Types.BIGINT, new DbType("integer")); dbDdlSyntax.setInlinePrimaryKeyConstraint(true); dbDdlSyntax.setIdentity(""); dbDdlSyntax.setDisableReferentialIntegrity("PRAGMA foreign_keys = OFF"); dbDdlSyntax.setEnableReferentialIntegrity("PRAGMA foreign_keys = ON"); } /** * Return null in case there is a sequence annotation. */ @Override public IdGenerator createSequenceIdGenerator(BackgroundExecutor be, DataSource ds, String seqName, int batchSize) { return null; } } 

Скомпилируйте и упакуйте класс в файл jar. При размещении внутри каталога lib вашего игрового приложения загрузчик классов загрузит класс перед исходной реализацией, и sqlite должен принять ddl, сгенерированный этой пользовательской реализацией.