2012-08-02 2 views
1

나는 Play를 배우고있다! 나는 To do List tutorial을 따라 갔다. 자, Anorm 대신 Squeryl을 사용하고 싶습니다. 그래서이 튜토리얼을 번역하려했는데 실제로 작동합니다.Play에서 Squeryl 트랜잭션 방지! 컨트롤러

아직도, 저를 괴롭히는 작은 것이 하나 있습니다. 여기 내 모델

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> 

를 들면, 마찬가지로 작업을 업데이트하거나 삭제하는 방법과 달리 컨트롤러 작업 내에서 트랜잭션을 관리해야했습니다. 나는 all 방법 inTransaction를 이동하는 경우

, 나는 예외를 얻을,

[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 트랜잭션을 사용하고 이러한 세부 정보를 컨트롤러 수준까지 노출시키지 않을 수 있습니까?

+0

왜 Iterable을 모델의 목록으로 변환하지 않으시겠습니까? –

답변

3

음. 세션 바인딩 (size() 메소드)이 필요한 Iterable에 대한 게으른 평가 때문입니다. Iterable을 List 또는 Vector (IndexedSeq)로 변환하면 작동합니다.

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

같은 질문에 대한 답은 http://stackoverflow.com/questions/11067425/squeryl-run-query-explicitly/11273250#11273250 –

+0

@mhs입니다. 링크를 가져 주셔서 감사합니다. – Andrea

관련 문제