有没有人成功使用Squeryl的externalTransactionManagementAdapter和play framework 2.0?:
object Global extends GlobalSettings {
override def onStart(app: Application) {
SessionFactory.externalTransactionManagementAdapter = Some(() =>
Some(new Session(
DB.getDataSource().getConnection(),
dbAdapter)
)
)
}
我无法让Squeryl返回到游泳池的连接。
它适用于SessionFactory.concreteFactory
,但是我必须使用事务块而不是参与Play的事务管理的squeryl。
这个问题是我之前问题的一个更具体的变体:How to integrate the Scala Squeryl ORB with play 2.0 framework?。
答案 0 :(得分:3)
这让我困扰了最近两天,所以我抓了一杯咖啡,浪费了一生的时间,但我想告诉你我是如何运作的:
在Global.scala
中放置此内容:
override def onStart(app: Application) {
SessionFactory.externalTransactionManagementAdapter = Some(() => {
if(org.squeryl.Session.hasCurrentSession) {
org.squeryl.Session.currentSessionOption.get
}
else {
val s = new org.squeryl.Session(DB.getDataSource().getConnection(), new PostgreSqlAdapter){
override def cleanup = {
super.cleanup
unbindFromCurrentThread
}
}
s.bindToCurrentThread
s
}
})
}
然后你需要做一些清理,以便你的应用程序不会出错(在同一个全球范围内):
/**
* cleans up Squeryl thread to each request
*/
override def onRouteRequest(request: RequestHeader): Option[Handler] = {
org.squeryl.Session.currentSessionOption.foreach(_.unbindFromCurrentThread)
super.onRouteRequest(request)
}
如果我发现任何警告等,我会更新此内容。http://lunajs.blogspot.ca/2011/06/squeryl-with-java-experiment.html
的覆盖清除答案 1 :(得分:0)
我目前正在“作弊”,使用SessionFactory.concreteFactory
和:
trait SquerylTransaction {
def TransAction(f: Request[AnyContent] => Result): Action[AnyContent] = {
Action { request =>
transaction {
f(request)
}
}
}
}
并在控制器中:
object Application extends Controller with SquerylTransaction {
def doStuff() = TransAction {
//squeryl query
}
}
但DeLonge的解决方案可能会更好。
我的Global.scala看起来像这样:
object Global extends GlobalSettings {
val dbAdapter = new PostgreSqlAdapter()
override def onStart(app: Application): Unit = {
SessionFactory.concreteFactory = Some(() =>
Session.create(
DB.getDataSource().getConnection(),
dbAdapter))
}
}