Problem when defining schema using OneToManyRelation

176 views
Skip to first unread message

Attendre

unread,
Jun 5, 2012, 12:19:22 AM6/5/12
to Squeryl
hi all I'm a green hand to squeryl and when I'm trying to define a db
schema which includes a OneToManyRelation I got this error:


java.lang.ExceptionInInitializerError
at Global$$anonfun$refreshDBSchema$1.apply$mcV
$sp(GlobalSettings.scala:31)
at Global$$anonfun$refreshDBSchema$1.apply(GlobalSettings.scala:25)
at Global$$anonfun$refreshDBSchema$1.apply(GlobalSettings.scala:25)
at org.squeryl.dsl.QueryDsl$class._using(QueryDsl.scala:46)
at org.squeryl.dsl.QueryDsl
$class._executeTransactionWithin(QueryDsl.scala:114)
at org.squeryl.dsl.QueryDsl$class.inTransaction(QueryDsl.scala:100)
at org.squeryl.PrimitiveTypeMode
$.inTransaction(PrimitiveTypeMode.scala:40)
at Global$.refreshDBSchema(GlobalSettings.scala:25)
at Global$.onStart(GlobalSettings.scala:21)
at play.api.GlobalPlugin.onStart(Global.scala:134)
at play.api.Play$$anonfun$start$1.apply(Play.scala:60)
at play.api.Play$$anonfun$start$1.apply(Play.scala:60)
at scala.collection.LinearSeqOptimized
$class.foreach(LinearSeqOptimized.scala:59)
at scala.collection.immutable.List.foreach(List.scala:45)
at play.api.Play$.start(Play.scala:60)
at play.api.test.Helpers$.running(Helpers.scala:32)
at db.DBTest.withSquerylTx(DBTest.scala:57)
at db.DBTest.authorsData(DBTest.scala:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod
$1.runReflectiveCall(FrameworkMethod.java:44)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:
15)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:
41)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:
20)
at
org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:
79)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:
71)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:
49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:
50)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:
38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:
467)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:
683)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:
390)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:
197)
Caused by: java.lang.RuntimeException: left side of assignment
''ConstantExpressionNode:None' is invalid, make sure statement uses
*only* closure argument.
at org.squeryl.dsl.ast.TypedExpressionNode
$class._fieldMetaData(ExpressionNode.scala:305)
at org.squeryl.PrimitiveTypeMode$$anon
$47._fieldMetaData(PrimitiveTypeMode.scala:167)
at org.squeryl.dsl.QueryDsl$class.org$squeryl$dsl$QueryDsl$
$_splitEquality(QueryDsl.scala:577)
at org.squeryl.dsl.QueryDsl
$OneToManyRelationImpl.<init>(QueryDsl.scala:509)
at org.squeryl.dsl.QueryDsl
$OneToManyRelationBuilder.via(QueryDsl.scala:481)
at models.Library$.<init>(Library.scala:13)
at models.Library$.<clinit>(Library.scala)
... 41 more
Caused by: java.lang.ClassCastException: org.squeryl.PrimitiveTypeMode$
$anon$47 cannot be cast to org.squeryl.dsl.ast.SelectElementReference
at org.squeryl.dsl.ast.TypedExpressionNode
$class._fieldMetaData(ExpressionNode.scala:301)
... 47 more

Here is my Schema definition code:


package models

import org.squeryl.PrimitiveTypeMode._
import org.squeryl.dsl._
import org.squeryl.KeyedEntity
import org.squeryl.Query
import org.squeryl.Schema

object Library extends Schema{
val books = table[Book]("books")
val authors = table[Author]("authors")
val authorToBooks = oneToManyRelation(authors, books)
.via((a, b) => a.id === b.authorId)
}

case class Book(
val id: Long,
val title: String,
var authorId: Option[Long]) extends KeyedEntity[Long] {
lazy val author = Library.authorToBooks.right(this)
}

case class Author(
val id: Long,
val firstName: String,
val lastName: String,
val email: Option[String]) extends KeyedEntity[Long] {

lazy val books = Library.authorToBooks.left(this)
}


Here is the unit test code using JUnit:

@Test def dllGenerationTest = {
import org.squeryl.SessionFactory
Class.forName("org.h2.Driver");
SessionFactory.concreteFactory = Some(() =>
Session.create(

java.sql.DriverManager.getConnection("jdbc:h2:mem:dllTest"),
new H2Adapter))

inTransaction {
models.Library.create
}
}

I'm using squeryl 0.9.5 with scala version 2.9.1. Anyone knows what's
the problem please help me, thanks a lot.

lee alex

unread,
Jun 5, 2012, 2:33:50 AM6/5/12
to Squeryl
I just found the problem is: type of authorId field of Book should be Long instead of Option[Long], that's it. 
Reply all
Reply to author
Forward
0 new messages