繁体   English   中英

Derby和Circumflex ORM的SQL语法错误

[英]SQL syntax error with Derby and Circumflex ORM

我正在尝试使用Circumflex ORM (在StackOverflow上建议 - 此处此处此处 )通过JDBC从Scala项目(使用简单构建工具构建)连接到本地(嵌入式)Apache Derby数据库。 我仔细按照说明操作,但我遇到了一些有趣的问题。

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

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对象(使用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...

我找到了这个帖子 ,其中某人遇到了与'遭遇'公共“和Apache Derby类似的问题,但回复似乎没有提出一个有用的前进方式。

可能导致这种情况的任何想法?

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

例如在Hibernate中你需要设置方言......

而且似乎你可以通过将“orm.defaultSchema”属性设置为“public”之外的其他东西来解决它,这似乎是Derby中的保留字

并且,最终编辑,大多数时候人们在创建表时不打算使用显式模式名称,并且他们只是获得默认值,但Circumflex似乎总是添加它,因此对于Derby,您应该能够使用“ APP“作为模式名称,或者事先创建自己的模式并使用其名称。

我一直在使用Circumflex ORM和Hypersonic。 它默认只支持Postgres,MySql和Oracle。 您需要扩展ru.circumflex.orm.Dialect以为Derby提供正确的SQL语法,并在cx.properties文件中声明此类。

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

这是我的Hypersonic方言文件,如果您只是在寻找一个简单的内存数据库,它可能对您有所帮助......

import ru.circumflex.orm._

 /** * @author James Baxter <jwbaxter(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()" } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM