方法完成后立即提交事务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了方法完成后立即提交事务相关的知识,希望对你有一定的参考价值。

我有以下问题:

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

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

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>

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

答案

不要将auto-commit设置为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你应该没问题。

以上是关于方法完成后立即提交事务的主要内容,如果未能解决你的问题,请参考以下文章

FragmentManager 已经在执行事务。提交后何时初始化寻呼机是安全的?

spring执行事务提交后进行一些逻辑操作

postgres WAL归档

postgres WAL归档

提交带有全屏片段的片段事务

分布式事务DevOps