scala - Session must be bound error using Squeryl -
update: okay, fixed problem having, i'm still not quite sure doing wrong. in case, wrote following method in ircdb:
def tryit[t](p: => t) = { class.forname("org.h2.driver") //what's point in this...? sessionfactory.concretefactory = some(() => session.create(java.sql.drivermanager.getconnection("jdbc:h2:~/irc","scalairc",""), new h2adapter)) transaction { p } } then used so:
val query = from(ircdb.channels)(c => select(c)) ircdb.tryit { (r <- query) println("chan: " + r.name) } and works. understanding, believed once session created using sessionfactory, i'd able use transaction { ... } anywhere has proper import. apparently, understanding incorrect.
if has add please do.
so, started using squeryl project i'm working on might oversight on part. so, first code:
i have following imports:
import org.squeryl.primitivetypemode._ import java.sql.timestamp import java.sql.drivermanager import java.util.date import org.squeryl.adapters.h2adapter import org.squeryl.dsl.{onetomany, manytoone, compositekey2} import org.squeryl._ i have following table defined:
class channeltable(val id: long, val name : string, val p_mode : boolean, val s_mode : boolean, val i_mode : boolean, val t_mode : boolean, val n_mode : boolean, val m_mode : boolean, val key : option[string]) extends keyedentity[long] { def this() = this(0,"", false, false, false, false, false, false, some("")) lazy val bans:onetomany[channelbantable] = ircdb.channeltochanbans.left(this) lazy val users = ircdb.channelusers.left(this) lazy val invites = ircdb.channelinvites.left(this) } and following schema defined:
object ircdb extends schema { val channels = table[channeltable] on(channels)(c => declare( c.p_mode defaultsto(false), c.s_mode defaultsto(false), c.i_mode defaultsto(false), c.t_mode defaultsto(false), c.n_mode defaultsto(false), c.m_mode defaultsto(false), c.name is(unique, indexed) )) def init { class.forname("org.h2.driver") //what's point in this...? sessionfactory.concretefactory = some(() => session.create(drivermanager.getconnection("jdbc:h2:~/irc","scalairc",""), new h2adapter)) } def getallchannels = transaction { from(channels)(c => select(c))} } i have been able insert table following @ console:
scala> import db._;import org.squeryl.primitivetypemode._ import db._ import org.squeryl.primitivetypemode._ scala> ircdb.init scala> transaction { ircdb.channels.insert(new channeltable(0,"#chan_name", false, false, false, false, false, false, none)) } res3: db.channeltable = db.channeltable@4 i can confirm h2 console indeed occur. however, when call ircdb.getallchannels (in both scala console , in code) following error:
java.lang.runtimeexception: no session bound current thread, session must created via session.create , bound thread via 'work' or 'bindtocurrentthread' @ scala.predef$.error(predef.scala:58) @ org.squeryl.session$$anonfun$currentsession$1.apply(session.scala:117) @ org.squeryl.session$$anonfun$currentsession$1.apply(session.scala:117) @ scala.option.getorelse(option.scala:59) @ org.squeryl.session$.currentsession(session.scala:116) @ org.squeryl.dsl.abstractquery.org$squeryl$dsl$abstractquery$$_dbadapter(abstractquery.scala:136) @ org.squeryl.dsl.abstractquery$$anon$1.<init>(abstractquery.scala:140) @ org.squeryl.dsl.abstractquery.iterator(abstractquery.scala:138) @ scala.collection.iterablelike$class.foreach(iterablelike.scala:79) @ org.squeryl.dsl.abstractquery.foreach(abstractquery.scala:27) @ scala.collection.traversablelike$class.map(traversablelike.scala:206) @ org.squeryl.dsl.abstractquery.map(abstractquery.scala:27) @ scala.runtime.scalaruntime$.inner$1(scalaruntime.scala:255) @ scala.runtime.scalaruntime$.stringof(scalaruntime.scala:258) @ requestresult$line7$object$.<init>(<console>:12) @ requestresult$line7$object$.<clinit>(<console>) @ requestresult$line7$object.scala_repl_result(<console>) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:39) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:25) @ java.lang.reflect.method.invoke(method.java:597) @ scala.tools.nsc.interpreter$request$$anonfun$loadandrun$1$$anonfun$apply$18.apply(interpreter.scala:981) @ scala.tools.nsc.interpreter$request$$anonfun$loadandrun$1$$anonfun$apply$18.apply(interpreter.scala:981) @ scala.util.control.exception$catch.apply(exception.scala:79) @ scala.tools.nsc.interpreter$request$$anonfun$loadandrun$1.apply(interpreter.scala:980) @ scala.tools.nsc.interpreter$request$$anonfun$loadandrun$1.apply(interpreter.scala:980) @ scala.util.control.exception$catch.apply(exception.scala:79) @ scala.tools.nsc.interpreter$request.loadandrun(interpreter.scala:979) @ scala.tools.nsc.interpreter.loadandrunreq$1(interpreter.scala:578) @ scala.tools.nsc.interpreter.interpret(interpreter.scala:597) @ scala.tools.nsc.interpreter.interpret(interpreter.scala:575) @ scala.tools.nsc.interpreterloop.reallyinterpret$1(interpreterloop.scala:471) @ scala.tools.nsc.interpreterloop.interpretstartingwith(interpreterloop.scala:514) @ scala.tools.nsc.interpreterloop.command(interpreterloop.scala:361) @ scala.tools.nsc.interpreterloop.processline$1(interpreterloop.scala:242) @ scala.tools.nsc.interpreterloop.repl(interpreterloop.scala:248) @ scala.tools.nsc.interpreterloop.main(interpreterloop.scala:558) @ scala.tools.nsc.interpreterloop.main(interpreterloop.scala:609) @ org.jetbrains.plugins.scala.compiler.rt.consolerunner.main(consolerunner.java:33) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:39) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:25) @ java.lang.reflect.method.invoke(method.java:597) @ com.intellij.rt.execution.application.appmain.main(appmain.java:115) i don't understand why getting error if able insert rows table doing same way. if try execute transaction { from(ircdb.channels)(c => select(c)) } @ console same error.
edit: i've added full stack trace. also, rewrote getallchannels function this:
def getallchannels = transaction { val ret = from(channels)(c => select(c)) println("sql: " + ret) ret } i still receive error, print query out first -- thought may useful:
sql: 'queryexpressionnode[root:1a0d111]:rsm='resultsetmapper:fdf48d()-- 'fieldselectelement:channeltable1_name org.squeryl.dsl.ast.fieldselectelement$$anon$3 'fieldselectelement:channeltable1_i_mode org.squeryl.dsl.ast.fieldselectelement$$anon$3 'fieldselectelement:channeltable1_s_mode org.squeryl.dsl.ast.fieldselectelement$$anon$3 'fieldselectelement:channeltable1_key org.squeryl.dsl.ast.fieldselectelement$$anon$3 'fieldselectelement:channeltable1_n_mode org.squeryl.dsl.ast.fieldselectelement$$anon$3 'fieldselectelement:channeltable1_m_mode org.squeryl.dsl.ast.fieldselectelement$$anon$3 'fieldselectelement:channeltable1_id org.squeryl.dsl.ast.fieldselectelement$$anon$3 'fieldselectelement:channeltable1_t_mode org.squeryl.dsl.ast.fieldselectelement$$anon$3 'fieldselectelement:channeltable1_p_mode org.squeryl.dsl.ast.fieldselectelement$$anon$3 'viewexpressionnode[sample:channeltable[16e3f87]]:rsm='resultsetmapper:442b95($(1->channeltable.name:java.lang.string),$(2->channeltable.i_mode:java.lang.boolean),$(3->channeltable.s_mode:java.lang.boolean),$(4->channeltable.key:option[java.lang.string]),$(5->channeltable.n_mode:java.lang.boolean),$(6->channeltable.m_mode:java.lang.boolean),$(7->channeltable.id:java.lang.long),$(8->channeltable.t_mode:java.lang.boolean),$(9->channeltable.p_mode:java.lang.boolean))--* select channeltable1.name channeltable1_name, channeltable1.i_mode channeltable1_i_mode, channeltable1.s_mode channeltable1_s_mode, channeltable1.key channeltable1_key, channeltable1.n_mode channeltable1_n_mode, channeltable1.m_mode channeltable1_m_mode, channeltable1.id channeltable1_id, channeltable1.t_mode channeltable1_t_mode, channeltable1.p_mode channeltable1_p_mode channeltable channeltable1 java.lang.runtimeexception: no session bound current thread, session must created via session.create , bound thread via 'work' or 'bindtocurrentthread' @ scala.predef$.error(predef.scala:58) @ org.squeryl.session$$anonfun$currentsession$1.apply(session.scala:117) @ org.squeryl.session$$anonfun$currentsession$1.apply(session.scala:117) @ scala.option.getorelse(option.scala:59) @ org.squeryl.session$.currentsession(session.scala:116) @ org.squeryl.dsl.abstractquery.org$squeryl$dsl$abstractquery$$_dbadapter(abstractquery.scala:136) @ org.squeryl.dsl.abstractquery$$anon$1.<init>(abstractquery.scala:140) @ org.squeryl.dsl.abstractquery.iterator(abstractquery.scala:138) @ scala.collection.iterablelike$class.foreach(iterablelike.scala:79) @ org.squeryl....
here's suspect, method :
def getallchannels = transaction { from(channels)(c => select(c))}
is returning unevaluated query, i.e. return type of
from(channels)(c => select(c))
is query[channeltable] method returns, transaction ended, console tries print it, triggers evaluation :
at org.squeryl.dsl.abstractquery.map(abstractquery.scala:27) @ scala.runtime.scalaruntime$.inner$1(scalaruntime.scala:255) @ scala.runtime.scalaruntime$.stringof(scalaruntime.scala:258) @ requestresult$line7$object$.<init>(<console>:12) @ requestresult$line7$object$.<clinit>(<console>) @ requestresult$line7$object.scala_repl_result(<console>) since transaction ended, message getting.
try :
def getallchannels = transaction { val q = from(channels)(c => select(c)) for(z <- q) { println(z) } }
Comments
Post a Comment