在Play中避免Squeryl交易!控制器

时间:2012-08-02 16:40:36

标签: scala playframework squeryl

我正在学习游戏!我跟着To do List tutorial。现在,我想用Squeryl代替Anorm,所以我试着翻译教程,实际上它可以工作。

然而,有一件小事让我烦恼。这是我的模型的相关部分

def all: Iterable[Task] = from(tasks) {s => select(s)}

以及控制器中列出所有任务的相应操作

def tasks = Action {
    inTransaction {
        Ok(views.html.index(Task.all, taskForm))
    }
}

视图包含,例如

<h1>@tasks.size task(s)</h1>

我不喜欢的是,与更新或删除任务的方法不同,我必须在控制器操作中管理事务。

如果我将inTransaction移至all方法,则会出现例外情况,

[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' Usually this error occurs when a statement is executed outside of a transaction/inTrasaction block] 

因为视图尝试获取tasks的大小,但该事务已在此时关闭。

  

有没有办法只在模型中使用Squeryl事务,而不是将这些细节暴露给控制器级别?

1 个答案:

答案 0 :(得分:3)

好。这是因为对Iterable的惰性求值需要会话绑定(size()方法)。 如果您将Iterable转换为List或Vector(IndexedSeq),我可能会这样做。

from(tasks)(s => select(s)).toIndexedSeq //or .toList