gpt4 book ai didi

scala - 在 Scala 中实现事务方面

转载 作者:行者123 更新时间:2023-12-02 00:07:20 24 4
gpt4 key购买 nike

我想实现效用函数/monad/方面来管理 scala 中的休眠事务,并寻求有关最佳方法的建议。

首先,我尝试创建如下柯里化(Currying)函数:

def session() = sessionFactory.getCurrentSession()

def transaction() = session().getTransaction()

def tx[A, B](f: A => B)(a: A): B = {
try {
session().beginTransaction()
val r = f(a)
transaction().commit()
return r
} catch {
case e:
Throwable =>
transaction().rollback()
throw e
} finally {
session.close()
}

我的想法是我可以用这个函数做以下事情:

def saveMyEntity() {
session().save(new MyEntity)
}

tx(saveMyEntity)()

并且 saveMyEntity 调用将被包装到事务中。

不幸的是,这段代码出现了以下错误:

[error]  found   : () => Unit
[error] required: ? => ?
[error] tx(saveMyEntity)()

我仍在学习 Scala,并寻求建议来改进我的方法。也许我可以以某种方式修改我的功能以获得更好的结果?或者添加另一个 Unit 类型的特定功能?还是选择另一条路?

有什么想法吗?任何scala规范的方式来实现这个?谢谢。

最佳答案

方法 tx 接受 1 个参数的函数作为参数,方法 saveMyEntity 不接受任何参数,所以你不能将它用作 A => B(1 个参数的函数)。

您没有单独使用af,因此在a 中没有必要。你可以使用 by-name这里的参数:

def tx[B](f: => B): B = {

如果你想使用 saveMyEntity 作为 Unit => Unit 你应该明确地创建函数:

tx[Unit, Unit](_ => saveMyEntity)(())

我想一些更改可能会提高代码的可读性:

import util.control.Exception.allCatch

def withSession[T](f: Session => T):T = {
val session = ??? // start session here
allCatch.anfFinally{
session.close()
} apply { f(session) }
}

def inTransaction[T](f: => T): T =
withSession{ session =>
session().beginTransaction()
try {
val r = f(a)
transaction().commit()
r
} catch {
case e: Throwable =>
transaction().rollback()
throw e
}
}

inTransaction{saveMyEntity}

关于scala - 在 Scala 中实现事务方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17520535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com