我有以下问题:
我正在使用Spring MVC 4.0.5和Hibernate 4.3.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>
我认为问题在于我使用延迟加载(因为每个用户可能都有大量其他附加的内容),所以在我尝试序列化对象之前不会提交事务。
答案 0 :(得分:3)
不要将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
你可以解决这个问题。