Scala Derby和扬抑ORM的SQL语法错误

Scala Derby和扬抑ORM的SQL语法错误,scala,jdbc,orm,derby,circumflex-orm,Scala,Jdbc,Orm,Derby,Circumflex Orm,我正试图使用(如StackOverflow和上所建议的)从Scala项目(使用简单构建工具构建)通过JDBC连接到本地(嵌入式)ApacheDerby数据库。我已经仔细地遵循了说明,但是我遇到了一些有趣的问题 以下是cx.properties文件的驱动程序和URL组件: orm.connection.driver=org.apache.derby.jdbc.EmbeddedDriver orm.connection.url=jdbc:derby:derbyDB (这些映射到使用原始JDBC的“

我正试图使用(如StackOverflow和上所建议的)从Scala项目(使用简单构建工具构建)通过JDBC连接到本地(嵌入式)ApacheDerby数据库。我已经仔细地遵循了说明,但是我遇到了一些有趣的问题

以下是cx.properties文件的驱动程序和URL组件:

orm.connection.driver=org.apache.derby.jdbc.EmbeddedDriver
orm.connection.url=jdbc:derby:derbyDB
(这些映射到使用原始JDBC的“反射驱动程序的实例创建和创建连接”模型,或者persistence.xml中的等效模型-扬抑使用一个简短的属性文件,因为,您知道,它不是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对象(使用sbt控制台调用的Scala 2.8.0 RC5 shell)并创建一个对象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...
java.sql.SQLSyntaxErrorException:语法错误:在第1行第13列遇到“public”。
位于org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(未知源)
位于org.apache.derby.impl.jdbc.Util.generateCsSQLException(未知源)
位于org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(未知源)
位于org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(未知源)
位于org.apache.derby.impl.jdbc.EmbedConnection.handleException(未知源)
位于org.apache.derby.impl.jdbc.ConnectionChild.handleException(未知源)
位于org.apache.derby.impl.jdbc.EmbeddePreparedStatement。(未知源)
位于org.apache.derby.impl.jdbc.EmbeddePreparedStatement20。(未知来源)
在org.apache.derby.impl.jdbc.embeddePreparedStatement30。。。
我发现有些人在“遇到了”public“和apachederby方面也有类似的问题,但是这些回复似乎并没有提出一种有用的方法


您知道是什么原因导致了这种情况吗?

您可能需要告诉扬抑显式使用Derby语法,而不是期望从JDBC驱动程序类名和URL推断出它

e、 在Hibernate中,您需要设置方言

看起来你可以通过设置“public”之外的其他选项来解决这个问题,这似乎是德比中的一个难题


最后一点,大多数情况下,人们在创建表时不需要使用显式的模式名,他们只需要获得默认值,但扬抑似乎总是添加它,因此对于Derby,您应该能够使用“APP”作为模式名,或者事先创建您自己的模式并使用其名称。

我一直在使用带高超音速的扬抑ORM。默认只支持Postgres、MySql和Oracle。您需要扩展ru.appriflex.orm.dialent,为Derby提供正确的SQL语法,并在cx.properties文件中声明此类。即

orm.dialect=com.magmanics.circumflex.orm.dialect.HsqldbDialect
这是我的高超音速方言文件,如果你只是在寻找一个简单的内存数据库,它可能会帮助你


导入ru.扬抑符.orm_

/**
 * @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()"
}
/**
*@作者詹姆斯·巴克斯特
*@自2010年6月19日起
*/
类HSQLDBDALECTION扩展了方言{
覆盖def timestampType=“TIMESTAMP”
重写def createSchema(schema:schema)=“创建架构”+schema.name+“授权DBA”
重写def createTable(table:table[\])=“CREATE table”+table.qualifiedName+”(“+table.fields.map(uql.toSql.mkString)(“,”+”)”
覆盖def列定义(字段:字段[]):字符串={
var result=field.name+“”+field.sqlType
field.default匹配{
案例部分(expr)=>result+=“”+expr
案例=>
}
如果(!field.nullable?&&!result.contains(“主键”))结果+=“NOT NULL”
返回结果
}
重写def primaryKeyExpression(记录:记录[])=“标识主键”
重写def initializeRelation(关系:relation[])={}
重写def lastIdExpression(节点:RelationNode[])=node.alias+“+node.relation.primaryKey.name+”=IDENTITY()
}

如果这不是一个特别有趣的问题,那么很抱歉——在被Rails的ActiveRecord实现的开箱即用的简单性所破坏之后,我仍然在Javaland中找到了自己的路。我很乐意被告知扬抑ORM很差劲并选择了其他东西。感谢Alex的帮助和IRC的帮助。
方言
trait还有
supportsSchema?()
方法——你可以用方言覆盖它,扬抑会忘记显式模式。永远,加油。感谢您创建了这样一个伟大的框架,很高兴能够为它做出贡献:)