方法完成后立即提交事务

was*_*stl 2 java spring hibernate jpa transactions

我有以下问题:

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

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

控制器.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);
    }

}
Run Code Online (Sandbox Code Playgroud)

服务.java

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

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

for every String find the corresponding setter and set the field to null
Run Code Online (Sandbox Code Playgroud)

正如我所说,这样做是为了避免数据序列化(使用 Jackson 2)

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

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

<prop key="hibernate.connection.autocommit">true</prop>
Run Code Online (Sandbox Code Playgroud)

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

Vla*_*cea 5

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

我认为你需要一个UserService接口和一个UserServiceImpl接口实现。无论您现在在课堂上拥有什么,都UserService必须迁移到UserServiceImpl其中。

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

如果您正在使用Open-Session-in-View反模式,则需要放弃它并使用 session-per-request 代替。它更具可扩展性,并且迫使您在数据层中处理最佳查询。

使用JDBC 事务管理和默认设置,session-close-on-request pattern您应该可以解决此问题。