【问题标题】:Commit transaction immideatly after method finished方法完成后立即提交事务
【发布时间】:2015-01-14 17:52:41
【问题描述】:

我有以下问题:

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

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

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>

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

【问题讨论】:

  • 使用事务,但开启自动提交?? O_o
  • 我确实打开了自动提交。

标签: java spring hibernate jpa transactions


【解决方案1】:

不要将自动提交设置为 true。 It's a terrible mistake.

我认为你需要一个UserService 接口和一个UserServiceImpl 来实现接口。您现在在 UserService 类中拥有的任何东西都必须迁移到 UserServiceImpl

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

如果你使用Open-Session-in-View 反模式,你需要放手和use session-per-request instead。它更具可扩展性,它迫使您在数据层中处理最佳查询。

使用JDBC Transaction Management and the default session-close-on-request pattern 你应该可以解决这个问题。

【讨论】:

  • 感谢您的回答。我确实打开了 PersistenceContext.EXTENDED,它确实解决了我关闭它的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 2017-02-26
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多