Ошибка синтаксиса SQL в Derby и Circumflex ORM - PullRequest
3 голосов
/ 25 июня 2010

Я пытаюсь использовать Circumflex ORM (как указано в StackOverflow - здесь , здесь и здесь ) для подключения к локальная (встроенная) база данных Apache Derby через JDBC из проекта Scala (построена с помощью простого инструмента сборки). Я внимательно следовал инструкциям, но у меня возникли некоторые интересные проблемы.

Вот компоненты драйвера и URL файла cx.properties:

orm.connection.driver=org.apache.derby.jdbc.EmbeddedDriver
orm.connection.url=jdbc:derby:derbyDB

(Они сопоставляются с моделью «создание экземпляра отраженного драйвера и создание соединения» с необработанным JDBC или эквивалентами в persistence.xml - Circumflex использует файл коротких и полезных свойств, потому что, как вы знаете, это не XML и это хорошо.)

Зависимости, которые я добавил в мой файл проекта sbt, которые имеют непосредственное отношение:

  "ru.circumflex" % "circumflex-orm" % "1.0",
  "org.apache.derby" % "derby" % "10.6.1.0"

Я создал короткую примерную модель, которая определяет упрощенную версию таблицы, которую описывает документация:

import java.sql.DriverManager
import ru.circumflex.orm._

class Country extends Record[Country] {
  val code = "code" VARCHAR(2)
  val name = "name" TEXT
}

object Country extends Table[Country]

Это, похоже, компилируется нормально, и я могу создать экземпляр объекта Country (используя оболочку Scala 2.8.0 RC5, вызванную с консоли sbt), создать объект в стиле ActiveRecord и затем сохранить его следующим образом:

val c = new Country
c.code := "US"
c.name := "United States of America"
c.save

Согласно документации, следует запустить проверку объекта и затем вставить его в базу данных. Я получаю следующее исключение:

java.sql.SQLSyntaxErrorException: Syntax error: Encountered "public" at line 1, column 13.
        at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
        at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedPreparedStatement30...

Я нашел эту ветку , где у кого-то возникла аналогичная проблема с "Обнаруженной" публикой "и Apache Derby, но ответы, похоже, не предлагают полезного способа продвижения вперед.

Есть идеи, что может быть причиной этого?

Ответы [ 2 ]

5 голосов
/ 25 июня 2010

Возможно, вы должны указать Circumflex явно использовать синтаксис Derby, вместо того, чтобы ожидать, что он будет выведен из имени класса URL-адреса и URL-адреса драйвера JDBC.

например. в Hibernate нужно установить диалект ...

И, кажется, вы можете обойти это, установив свойство "orm.defaultSchema" в значение, отличное от "public", которое в Derby выглядит как зарезервированное слово .

И, наконец, окончательное редактирование, большинство людей не удосуживаются использовать явное имя схемы при создании таблиц, и они просто получают значение по умолчанию, но Circumflex, кажется, всегда добавляет его, поэтому для Derby вы должны иметь возможность использовать «APP» в качестве имени схемы или заранее создать собственную схему и использовать ее имя.

2 голосов
/ 28 июня 2010

Я использую Circumflex ORM с Hypersonic.Он поддерживает только Postgres, MySql и Oracle по умолчанию.Вам нужно расширить ru.circumflex.orm.Dialect, чтобы предоставить правильный синтаксис SQL для Derby, и объявить этот класс в файле cx.properties.то есть

orm.dialect=com.magmanics.circumflex.orm.dialect.HsqldbDialect

Вот мой файл гиперзвукового диалекта, он может помочь вам, если вы просто ищете простую в памяти базу данных ...

import ru.circumflex.orm._</p> <pre><code>/** * @author James Baxter <j.w.baxter(at)gmail> * @since 19-Jun-2010 */ class HsqldbDialect extends Dialect { override def timestampType = "TIMESTAMP" override def createSchema(schema: Schema) = "CREATE SCHEMA " + schema.name + " AUTHORIZATION DBA" override def createTable(table: Table[_]) = "CREATE TABLE " + table.qualifiedName + " (" + table.fields.map(_.toSql).mkString(", ") + ")" override def columnDefinition(field: Field[_]): String = { var result = field.name + " " + field.sqlType field.default match { case Some(expr) => result += " " + expr case _ => } if (!field.nullable_? && !result.contains("PRIMARY KEY")) result += " NOT NULL" return result } override def primaryKeyExpression(record: Record[_]) = "IDENTITY PRIMARY KEY" override def initializeRelation(relation: Relation[_]) = {} override def lastIdExpression(node: RelationNode[_]) = node.alias + "." + node.relation.primaryKey.name + " = IDENTITY()" }

...