java - 带有 Spring REST 服务的 LazyInitializationException

标签 java spring hibernate rest spring-mvc

我有一个结合了 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 类 UserPhone以这种方式注释,所以 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/

相关文章:

java - 我可以修改JPA中的id类型,从 "int"到 "long"而不影响数据库中已存在表中的数据

java - 找不到 “http://java.sun.com/jsp/jSTL/core” 的标记库描述符

java - 任务是检查no的第一位是否为零?

java - Spring Boot 2.2.0 如何接受 RequestBody 中的日期参数?

spring - LocalContainerEntityManagerFactoryBean 和 LocalEntityManagerFactoryBean 有什么区别?

java - JPA:em.flush() 之后的 em.clear() 会改变事务语义吗?

javascript - Nashorn 多线程编程

java - 如何在 GXT 中合并网格单元格

java - Spring中如何定义一个String数组的bean(使用XML配置)

java - 比较 2 个日期 javafx