2011-04-12 7 views
8

का उपयोग कर सत्र को बाध्य त्रुटि होना चाहिए अद्यतन: ठीक है, मैंने जिस समस्या का सामना किया था, ठीक है, लेकिन मुझे अभी भी यकीन नहीं है कि मैं क्या गलत कर रहा था। किसी भी मामले में, मैं IRCDB में निम्न विधि ने लिखा है:स्क्वायरल

def tryit[T](p: => T) = { 
    Class.forName("org.h2.Driver") //what's the point in this...? 

    SessionFactory.concreteFactory = Some(() => 
     Session.create(java.sql.DriverManager.getConnection("jdbc:h2:~/irc","ScalaIRC",""), new H2Adapter)) 

    transaction { 
     p 
    } 
} 

तो इतना है कि यह प्रयोग किया है:

val query = from(IRCDB.channels)(c => select(c)) 
IRCDB.tryit { 
    for (r <- query) println("chan: " + r.name) 
} 

और अब यह काम करता है। मेरी समझ से, मेरा मानना ​​था कि एक बार सत्र फ़ैक्टरी का उपयोग करके सत्र बनाया गया था, मैं कहीं भी transaction { ... } का उपयोग करने में सक्षम हूं जिसके पास उचित आयात है। जाहिर है, मेरी समझ गलत है।

यदि किसी को जोड़ने के लिए कुछ भी है तो कृपया करें।


तो, मैंने अभी जिस परियोजना पर काम कर रहा हूं उसके लिए स्क्वायरल का उपयोग शुरू किया है, इसलिए यह मेरे हिस्से पर एक निरीक्षण हो सकता है। तो, पहले कोड:

मैं निम्नलिखित आयात है:

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._ 

मैं निम्न तालिका को परिभाषित किया है:

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) 
} 

और निम्नलिखित स्कीमा परिभाषित:

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 the point in this...? 

     SessionFactory.concreteFactory = Some(() => 
      Session.create(DriverManager.getConnection("jdbc:h2:~/irc","ScalaIRC",""), new H2Adapter)) 
    } 
    def getAllChannels = transaction { from(channels)(c => select(c))} 
} 

मैं कंसोल पर निम्नलिखित के साथ तालिका में सम्मिलित करने में सक्षम हूं:

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 = [email protected] 

मैं एच 2 कंसोल के साथ पुष्टि कर सकता हूं कि यह वास्तव में होता है।

java.lang.RuntimeException: no session is bound to current thread, a session must be created via Session.create 
and bound to the thread via 'work' or 'bindToCurrentThread' 
    at scala.Predef$.error(Predef.scala:58) 
    at org.squeryl.Session$$anonfun$currentSession$1.apply(Session.scala:117) 
    at org.squeryl.Session$$anonfun$currentSession$1.apply(Session.scala:117) 
    at scala.Option.getOrElse(Option.scala:59) 
    at org.squeryl.Session$.currentSession(Session.scala:116) 
    at org.squeryl.dsl.AbstractQuery.org$squeryl$dsl$AbstractQuery$$_dbAdapter(AbstractQuery.scala:136) 
    at org.squeryl.dsl.AbstractQuery$$anon$1.<init>(AbstractQuery.scala:140) 
    at org.squeryl.dsl.AbstractQuery.iterator(AbstractQuery.scala:138) 
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:79) 
    at org.squeryl.dsl.AbstractQuery.foreach(AbstractQuery.scala:27) 
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:206) 
    at org.squeryl.dsl.AbstractQuery.map(AbstractQuery.scala:27) 
    at scala.runtime.ScalaRunTime$.inner$1(ScalaRunTime.scala:255) 
    at scala.runtime.ScalaRunTime$.stringOf(ScalaRunTime.scala:258) 
    at RequestResult$line7$object$.<init>(<console>:12) 
    at RequestResult$line7$object$.<clinit>(<console>) 
    at RequestResult$line7$object.scala_repl_result(<console>) 
    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 scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$18.apply(Interpreter.scala:981) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$18.apply(Interpreter.scala:981) 
    at scala.util.control.Exception$Catch.apply(Exception.scala:79) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1.apply(Interpreter.scala:980) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1.apply(Interpreter.scala:980) 
    at scala.util.control.Exception$Catch.apply(Exception.scala:79) 
    at scala.tools.nsc.Interpreter$Request.loadAndRun(Interpreter.scala:979) 
    at scala.tools.nsc.Interpreter.loadAndRunReq$1(Interpreter.scala:578) 
    at scala.tools.nsc.Interpreter.interpret(Interpreter.scala:597) 
    at scala.tools.nsc.Interpreter.interpret(Interpreter.scala:575) 
    at scala.tools.nsc.InterpreterLoop.reallyInterpret$1(InterpreterLoop.scala:471) 
    at scala.tools.nsc.InterpreterLoop.interpretStartingWith(InterpreterLoop.scala:514) 
    at scala.tools.nsc.InterpreterLoop.command(InterpreterLoop.scala:361) 
    at scala.tools.nsc.InterpreterLoop.processLine$1(InterpreterLoop.scala:242) 
    at scala.tools.nsc.InterpreterLoop.repl(InterpreterLoop.scala:248) 
    at scala.tools.nsc.InterpreterLoop.main(InterpreterLoop.scala:558) 
    at scala.tools.nsc.InterpreterLoop.main(InterpreterLoop.scala:609) 
    at org.jetbrains.plugins.scala.compiler.rt.ConsoleRunner.main(ConsoleRunner.java:33) 
    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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:115) 

मुझे समझ नहीं आता क्यों मैं इस त्रुटि हो रही हो जाएगा अगर मैं में पंक्तियां सम्मिलित करने में सक्षम था: हालांकि, जब मैं IRCDB.getAllChannels फोन (दोनों स्काला कंसोल में और कोड में) मैं निम्नलिखित त्रुटि मिलती है टेबल लगभग उसी तरह से कर रहा है। यदि मैं कंसोल पर transaction { from(IRCDB.channels)(c => select(c)) } निष्पादित करने का प्रयास करता हूं तो मुझे एक ही त्रुटि मिलती है।


संपादित करें: मैं पूर्ण स्टैक ट्रेस जोड़ दिया है। इसके अलावा, मैं getAllChannels समारोह इस तरह दुबारा लिखा:

def getAllChannels = transaction { 
    val ret = from(channels)(c => select(c)) 
    println("sql: " + ret) 
    ret 
} 

मैं अभी भी एक त्रुटि प्राप्त है, लेकिन यह पहली क्वेरी प्रिंट आउट करता है - मुझे लगा कि यह उपयोगी हो सकता है:

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 as ChannelTable1_name, 
    ChannelTable1.i_mode as ChannelTable1_i_mode, 
    ChannelTable1.s_mode as ChannelTable1_s_mode, 
    ChannelTable1.key as ChannelTable1_key, 
    ChannelTable1.n_mode as ChannelTable1_n_mode, 
    ChannelTable1.m_mode as ChannelTable1_m_mode, 
    ChannelTable1.id as ChannelTable1_id, 
    ChannelTable1.t_mode as ChannelTable1_t_mode, 
    ChannelTable1.p_mode as ChannelTable1_p_mode 
From 
    ChannelTable ChannelTable1 
java.lang.RuntimeException: no session is bound to current thread, a session must be created via Session.create 
and bound to the thread via 'work' or 'bindToCurrentThread' 
    at scala.Predef$.error(Predef.scala:58) 
    at org.squeryl.Session$$anonfun$currentSession$1.apply(Session.scala:117) 
    at org.squeryl.Session$$anonfun$currentSession$1.apply(Session.scala:117) 
    at scala.Option.getOrElse(Option.scala:59) 
    at org.squeryl.Session$.currentSession(Session.scala:116) 
    at org.squeryl.dsl.AbstractQuery.org$squeryl$dsl$AbstractQuery$$_dbAdapter(AbstractQuery.scala:136) 
    at org.squeryl.dsl.AbstractQuery$$anon$1.<init>(AbstractQuery.scala:140) 
    at org.squeryl.dsl.AbstractQuery.iterator(AbstractQuery.scala:138) 
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:79) 
    at org.squeryl.... 
+0

कि पूर्ण स्टैकट्रेस है? क्या आपके कोड में शामिल होने वाली किसी भी पंक्ति में कोई सुराग नहीं है? – thoredge

+0

यदि आप "लेनदेन {IRCDB.getAllChannels}" कॉल करने का प्रयास करते हैं तो क्या होगा? –

+0

मैंने पोस्ट को पूर्ण स्टैक ट्रेस के साथ अपडेट किया है। रुस्तम, मैंने बस कोशिश की और दुर्भाग्य से मुझे एक ही त्रुटि मिल गई। – ReferentiallySeethru

उत्तर

9

यहाँ, मैं क्या संदेह है अपने विधि:

def getAllChannels = transaction { from(channels)(c => select(c))}

एक unevaluated क्वेरी लौटा रहा है, अर्थातलेन-देन के बाद से

at org.squeryl.dsl.AbstractQuery.map(AbstractQuery.scala:27)   
at scala.runtime.ScalaRunTime$.inner$1(ScalaRunTime.scala:255) 
at scala.runtime.ScalaRunTime$.stringOf(ScalaRunTime.scala:258) 
at RequestResult$line7$object$.<init>(<console>:12) 
at RequestResult$line7$object$.<clinit>(<console>) 
at RequestResult$line7$object.scala_repl_result(<console>) 

:

from(channels)(c => select(c))

की वापसी प्रकार Query[ChannelTable] तो विधि रिटर्न, लेन-देन समाप्त हो गया है, सांत्वना इसे प्रिंट करने की कोशिश करता, जो एक मूल्यांकन से चलाता है समाप्त हो गया है, आपको वह संदेश मिल रहा है जो आपको मिल रहा है।

इस प्रयास करें:


def getAllChannels = transaction { 
    val q = from(channels)(c => select(c)) 
    for(z <- q) { 
    println(z) 
    } 
} 
+1

यदि सिद्धांत सही है, तो मैं स्क्वायरल को पैच करने की कोशिश करूंगा कि आरईपीएल कंसोल का डिफ़ॉल्ट व्यवहार जो 'मानचित्र' को कॉल करना है, से बचा जाता है। ऐसा लगता है कि कंसोल, जब यह फ़ंक्शन से वापस आने पर Iterables पर मानचित्र को कॉल करता है। –

+0

धन्यवाद मैक्स, वास्तव में यह समस्या थी। प्रश्नों के काम के लिए मुझे एक गलतफहमी थी। महान पुस्तकालय, वैसे - कुछ अन्य लोगों की तुलना में थोड़ा अधिक सीधे आगे। – ReferentiallySeethru

0

हो सकता है, त्रुटि परिणाम को कंसोल पर प्रिंट करते समय प्रकट होता है और क्वेरी ठीक थी। कृपया, पूर्ण stacktrace प्रदान करें।

+0

पूर्ण स्टैक ट्रेस प्रदान किया जाता है। – ReferentiallySeethru