当前位置: 首页 > 知识库问答 >
问题:

方法完成后立即提交事务

左丘子平
2023-03-14

我有以下问题:

我正在使用Spring MVC 4.0.5和Hibernate 4.3.5,我正在尝试创建一个Restfull Web应用程序。问题是,我想排除某些字段,使其无法序列化为 JSON,具体取决于使用方面在控制器中调用的方法。

我现在的问题是Hibrate不会在事务从方法返回后立即提交事务,而只是在序列化之前提交。

Controller.java

public class LoginController {
    /*
     *  Autowire all the Services and stuff..
     */
    @RemoveAttribues({"fieldA","fieldB"})
    @RequestMapping{....}
    public ResponseEntity login(@RequestBody user) {
        User updatedUser = userService.loginTheUser(user);
        return new ResponseEntity<>(updatedUser,HttpStatus.OK);
    }

}

Service.java

public class UserService {
    @Transactional
    public User loginUser(User user) {
        user.setLoginToken("some generated token");
        return userDao.update(user); //userDao just calls entityManager.merge(..)
    }
}

方面的建议执行以下操作:

for every String find the corresponding setter and set the field to null

这样做,就像我说的,以避免数据序列化(用于Jackson 2)

现在的问题是,只有在通知完成后,才提交事务。我能做些什么来告诉hibernate立即提交,或者我必须深入挖掘并开始自己处理事务(我希望避免这样做)?

编辑:我还打开了自动提交

<prop key="hibernate.connection.autocommit">true</prop>

我认为问题在于我使用延迟加载的事实(因为每个用户可能都附加了大量的其他enities),所以在我尝试序列化对象之前,事务不会提交。

共有1个答案

汪志业
2023-03-14

不要将自动提交设置为true。这是一个可怕的错误。

我认为您需要一个UserService接口和一个UserServiceImpl用于接口实现。您现在在UserService类中的任何内容都必须迁移到UserServiceImpl

这可以确保@Transactions甚至应用于JDK动态代理,而不仅仅是CGLIB运行时代理。

如果您使用的是“在视图中打开会话”反模式,则需要放手并改用“按请求会话”。。它的可扩展性要高得多,它迫使您处理数据层的最佳查询。

使用 JDBC 事务管理和默认的会话-按请求关闭模式,您应该可以解决此问题。

 类似资料:
  • 默认情况下,Spring数据JPA已禁用自动提交 因此,如果我使用/扩展CrudRepository来使用save方法保存对象,那么场景后面会发生什么??将对象保存到DB后,spring jpa是否也提交该操作 如果没有,如何显式提交操作? 编辑以下“Michal Drozd”评论:(以下是针对JpaRepository而非Crudepository)本文:Spring数据JPA中save()和s

  • 我正试着在从主题读到它之后提交一个信息。我通过这个链接(https://www.confluent.io/blog/apache-kafka-spring-boot-application)使用Spring创建一个Kafka消费者。通常情况下,它工作得很好,消费者得到消息,然后等待另一个人进入队列。但问题是,当我处理这些消息时,它会花费很多时间(大约10分钟),kafka队列认为消息没有被消耗(提

  • 问题内容: 我将一堆可运行的对象放入ExecutorService中: 我希望我的程序/过程在所有工作人员完成后立即停止。但是根据我的日志,这种情况还需要20到30秒。工人没有分配任何资源,实际上,他们目前什么都不做。 不要误会我的意思,这对我来说不是一个关键问题,我只是想了解正在发生的事情,而且我想知道这是否是正常行为。 问题答案: 使用它的。的javadocs说“每个新线程都被创建 为非守护

  • 我在这里很困惑。JPA中的提交或回滚完成事务吗?我使用的是spring和容器管理的EntityManager。感谢任何回答。

  • 说明 协议2.1中读取state=2,3的结账请求后,从业务系统完成结账,并提交结果到服务端 请求地址 http://api.dc78.cn/Api/cash_post_cash 请求方式 GET 请求参数 参数 参数名称 必填 描述 范例 id 请求编号 此编号为协议2.1中返回的结算单id bzid 结算业务单号 返回 {"status":1,"info":"提交成功"} 请求方式 INI 请

  • 秒付业务,下行接口收到cash-pay后(下行接口详见0.5),完成相应的结账业务流程,并上传确认支付订单处理完成。 请求参数说明 参数 描述 必填 示例值 类型 最大长度 action 接口参数组 是 object └action 需要调用的接口名称 是 cash_post_cash string get GET参数组,本组参数需要参与签名 是 object └id 支付单流水号payid 是