我有一个结合了 Hibernate 的 Spring 应用程序来编写一些我可以使用的服务。我没有 View ,因为这些是来自发送和获取 JSON 结果的手机的服务调用。
所以我有一个 Controller
它处理 REST 调用:
@Controller
@RequestMapping(value = "/test")
public class TestController {
@Autowired
private TestService testService;
…
@RequestMapping(value = "/", method = RequestMethod.PUT)
public ResponseEntity<Map<String, Object>> testMethod(
@RequestHeader("userid") Integer userid, …) {
User user = testService.getUserById(userid);
List<Phone> phones = user.getPhones();
phones.add(…);
…
}
}
如果我尝试访问 Phones
, 我得到一个 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.example.pojo.User.phones, no session or session was closed
.
我有两个 POJO 类 User
和 Phone
以这种方式注释,所以 User
是这个一对多关系的所有者:
@OneToMany(cascade = { CascadeType.ALL })
@JoinColumn(name = "USER_ID")
private List<Phone> phones;
@ManyToOne
@JoinColumn(name = "USER_ID", insertable = false, updatable = false, nullable = false)
private User user;
我的结构是 Service -> ServiceImplementation 和 Dao -> DaoImplementation。
ServiceImplementation 方法 getUserById(userid)
注释为@Transactional
.
我该如何解决这个问题?我知道,在此服务 REST 调用中,我总是需要获取电话列表。我读了……关于 OpenSessionInView,但它似乎是使用 View 的模式,我没有。
放一个 Hibernate.initialize(user.getPhones());
在 List<Phone> phones = user.getPhones();
前不起作用。
我知道这是一个常见问题,但我不知道如何解决。
最佳答案
基于此:
LazyInitializationException Within a @Transactional Method
设置注解驱动的事务:
<tx:annotation-driven />
然后注释你的方法@Transactional
只要您在同一事务中获取用户并访问他们的电话列表,就可以使用惰性提取。即,只有在响应中需要时才获取电话列表。
关于java - 带有 Spring REST 服务的 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19906707/