3

Circumflex ORM(StackOverflowで提案されているように-ここここここ)を使用して、Scalaプロジェクト(単純なビルドツールでビルド)からJDBCを介してローカル(埋め込み)ApacheDerbyデータベースに接続しようとしています。指示に注意深く従っていますが、いくつかの興味深い問題があります。

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シェルを使用)、オブジェクト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...

誰かが「遭遇した「パブリック」」とApacheDerbyで同様の問題を抱えているこのスレッドを見つけましたが、返信は今後の有用な方法を示唆していないようです。

これを引き起こしている可能性のあるアイデアはありますか?

4

2 に答える 2

5

JDBC ドライバーのクラス名と URL から Derby 構文を推測するのではなく、明示的に Derby 構文を使用するように Circumflex に指示する必要がある可能性があります。

たとえば、休止状態では、方言を設定する必要があります...

また、 「orm.defaultSchema」プロパティを「public」以外に設定することで回避できるようです。これは Derby の予約語のようです。

最後に、ほとんどの場合、人々はテーブルを作成するときに明示的なスキーマ名を使用することを気にせず、デフォルトを取得するだけですが、Circumflex は常にそれを追加しているように見えるため、Derby では「 APP" をスキーマ名として使用するか、独自のスキーマを事前に作成してその名前を使用します。

于 2010-06-24T20:30:02.917 に答える
2

Hypersonic で Circumflex ORM を使用しています。デフォルトでは、Postgres、MySql、および Oracle のみをサポートします。ru.circumflex.orm.Dialect を拡張して Derby の正しい SQL 構文を提供し、cx.properties ファイルでこのクラスを宣言する必要があります。すなわち

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

これが私の極超音速方言ファイルです。単純なメモリ内データベースを探しているだけの場合に役立つかもしれません...

import ru.circumflex.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-06-28T19:21:13.107 に答える