簡體   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