Play2 如何从服务层而不是动作层管理事务?

2024-04-12

我正在使用 Play2.1.1 Java 和 JPA2.0 以及 hibernate 实现。

通过代码控制事务而不是像下面那样使用 @transactional 是正常的 JPA 代码风格,有没有办法在 Play 上像下面这样工作?或者如何使用 JPA.withtranaction() 来做?我尝试了一下,不知道如何传入参数,我对功能代码不熟悉。多谢。请给我一些基于下面的示例代码。

public  void createActorB(final String email, final String psw) throws Throwable {
    EntityManager manager = JPA.em();
    try {
        EntityTransaction ex = manager.getTransaction();
        this.dbActor.setEmail(email);
        this.dbActor.setCredential(psw);
        manager.persist(this.dbActor);
        ex.commit();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        throw new ActorException(CODE.UNKNOWN, e);
    } finally {
        manager.close();
    }
}

现在我更改下面的代码以从服务层启动事务,它看起来效率不高,还有其他写法吗?谢谢

private void internalCreateActor(String email, String psw) throws ActorException {
        if (StringUtils.isEmpty(email) || StringUtils.isEmpty(psw))
            throw new ActorException(CODE.INVALIDE_PARAMETER);
        try {
            this.dbActor.setEmail(email);
            this.dbActor.setCredential(psw);
            this.dbActor.setCreateD(new Date());
            JPA.em().persist(this.dbActor);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new ActorException(CODE.UNKNOWN, e);
        }
    }

 public void createActor(final String email, final String psw, final String cellPhone, final Actor.TYPE type)
            throws Throwable {

        JPA.withTransaction(new Callback0() {
            @Override
            public void invoke() throws Throwable {
                internalCreateActor(email, psw, cellPhone, type);
            }
        });
    }

像这样的东西:

public static User getUserByIdentity(final AuthUserIdentity identity) {
    try {
        return JPA.withTransaction(new play.libs.F.Function0<User>() {
            public User apply() {       
                return User.findByAuthUserIdentity(identity);
            }
        });
    } catch (Throwable t) {
        throw new RuntimeException(t);
    }       
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Play2 如何从服务层而不是动作层管理事务? 的相关文章

随机推荐

  • 返回正则表达式中匹配的部分

    在使用的正则表达式中OR 管道 是否有一种方便的方法来获取匹配的表达式部分 Example horse caMel TORTOISe i exec Camel returns Camel 我想要的是caMel 我知道我可以循环遍历选项 而不
  • 单步执行断点时出现编译错误

    每当我遇到断点并尝试跨过它或进入它时 我就开始遇到奇怪的错误 我收到消息 进行了无法编译的编辑 在修复编译错误之前 无法继续执行 这些项目编译得很好 当我没有遇到任何断点时 这种情况就不会发生 我使用的是 Visual Studio 201
  • 使用Haxe宏进行条件编译,而不是#if #end

    假设我们有一个 Local 类 class Local static inline public var logLevel Int 3 以及一些功能 Tool debug s String compiled if logLevel gt 0
  • Bonjour 通过蓝牙无需 Gamekit ?

    我想知道在 iPhone OS 3 0 或更高版本中直接通过蓝牙使用 bonjour 而不使用 GameKit 的可能性 谁能提供任何例子吗 只需宣布服务 就像tc 下面已经说了 https stackoverflow com q 3845
  • Xamarin Forms Entry 调用 Completed 事件

    我目前正在 Xamarin Forms 中开发登录和注册页面 将键盘的完成按钮更改为下一个并继续最后一个按钮后 我不再在 Android 上收到 Completed 事件 在 iOS 上工作正常 在自定义渲染器中 我可以捕获 Control
  • 在 mac os x Sierra 上使用 opencv c++ 编译 hello world

    第一次我无法编译 hello world 我已经遵循了大量如何安装 opencv 的教程 我只有以下示例 include
  • 为以 exec 启动的进程设置自定义工作目录

    我正在打电话execv在我的 C 代码中启动可执行文件 但我想将其工作目录设置为自定义目录 例如 在一种情况下 我正在启动ls 但它列出了我原始程序目录中的文件 但我想将工作目录设置为自定义目录 我将如何实现它 这样 我将其设置为 usr
  • 无法将 Watson IoT Platform 连接到 Cloudant

    一段时间以来 我一直在尝试将 Watson IoT Platform 作为 Historian 服务连接到 Cloudant 数据库 我遵循了各种可用教程中的说明 但一项服务从未显示为与另一项服务的可能连接或扩展 这是我尝试过的一个教程ht
  • ios 8 解析推送中没有声音[重复]

    这个问题在这里已经有答案了 这很奇怪 更新我的应用程序以支持通过 Parse 使用 Parse 仪表板 发送的 iOS 8 推送通知后 推送通知不会发出任何声音 我在 Stackoverflow 上发现了这个重复项 但发布的答案对我不起作用
  • 解析 JSON 到 MySQL 表

    我正在使用 Zend Framework 1 12 我想创建一个基于 JSON 文件的表 我已经创建了表及其字段 现在它们都是长文本 它所要做的就是将它们插入到正确的列中 我遵循了这些例子 http www daniweb com web
  • 代表和活动之间有什么区别?

    代表和活动之间有什么区别 两者不都包含对可以执行的函数的引用吗 An Event声明增加了一层抽象和保护delegate实例 此保护可防止委托的客户端重置委托及其调用列表 并且仅允许在调用列表中添加或删除目标
  • WCF 中未返回 DateTime.Kind

    当处理DateTime具有 WCF 的对象 返回DateTime对象丢失了Kind财产 永远是DateTimeKind Unspecified即使我在退货之前手动更改它 我在 WCF 端这样做了 dateFrom DateTime Spec
  • 根据用户 ID 限制下拉选项

    我问这个问题是因为我不确定解决问题的最佳方法 问题 我有一个预先填充的下拉列表 其中包含 1 000 个左右的数字 我需要根据使用下拉列表的用户来限制下拉列表中显示的数字 我想到的解决方案 使用 jQuery 隐藏所有数字 使用 jQuer
  • Firebase:如何检查电子邮件是否在运行时经过验证

    所以流程将是这样的 用户通过 firebase 使用电子邮件和密码登录 如果电子邮件经过验证 他们将转到主要活动 否则他们将进入验证电子邮件活动 我想做的是 当他们处于验证电子邮件活动时 我将在 onCreate 方法中发送验证电子邮件 然
  • 有没有办法用#define 代替长命名空间?

    假设我有一个很长的命名空间 我不想一直输入它 但我不想使用using namespace 任何一个 我可以为此使用 define 吗 Example define glm quat glm gtc quaternion class Came
  • Javascript 网络摄像头捕获并使用 PHP 上传到服务器

    我有一个页面 使用 javascript 和 PHP 上传文件成功上传图像表单画布 第二页已成功将网络摄像头捕获到画布并正确显示 我正在尝试使用摄像头捕获实时CSS对象来调整图像上传脚本 但什么也不做 html是 折断 div div cl
  • Laravel Passport tokensExpireIn 似乎不起作用

    我正在使用 Laravel 5 4 Passport 来创建 SPA 应用程序 但是 我能够使身份验证工作 但访问令牌始终是短期令牌 过期时间为 600 秒 我无法通过以下方式增加过期时间 Passport tokensExpireIn C
  • 如何在 pandas groupby 直方图中显示标签名称

    我可以使用 pandas 在单个图中绘制多个直方图 但缺少一些东西 如何给出标签 我只能绘制一个图形 如何将其更改为layout 3 1 或其他内容 另外 在图1中 所有的垃圾箱都填充了纯色 很难知道哪个是哪个 那么如何用不同的标记 例如十
  • 有没有有效的方法来禁用 HTML 表单中的自动完成功能?

    当使用xhtml1 transitional dtddoctype 使用以下 HTML 收集信用卡号
  • Play2 如何从服务层而不是动作层管理事务?

    我正在使用 Play2 1 1 Java 和 JPA2 0 以及 hibernate 实现 通过代码控制事务而不是像下面那样使用 transactional 是正常的 JPA 代码风格 有没有办法在 Play 上像下面这样工作 或者如何使用