为什么 jHipster 项目没有在 Controller 中得到 LazyInitializationException?

Why didn't jHipster project get LazyInitializationException in Controller?

jHispster 项目使用什么设置来避免控制器中出现 LazyInitializationException?

我的控制器:

 @GetMapping("/citys")
@Timed
public ResponseEntity<List<City>> getAllCidades(@ApiParam Pageable pageable) {
    log.debug("REST request to get a page of Citys");
    Page<City> page = cityService.findAll(pageable);
    HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/citys");
    return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
}

城市实体:

@Entity
@Table(name = "city")
public class Cidade implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @NotNull
    @Column(name = "name", nullable = false)
    private String name;

    @ManyToOne(optional = false)
    @NotNull
    private State state;
...
// gets and sets
}

这实际上是一个 Spring 引导而不是 JHipster 选项。具体 属性 被命名为 spring.jpa.open-in-view。默认是true,导致Spring开机注册OpenEntityManagerInViewInterceptor.

来源:Spring Boot properties reference

As jdubois mentioned 这是 "normal" 与 JPA,如果您在事务之外访问惰性关系。

通常情况下,您应该使用带有事务的服务层。例如,UserService class 非常适合完成这项工作。

我们剩下的仅有的两个选项是:

使用视图模式中的打开会话。我不喜欢它,因为它向开发人员隐藏了问题:他应该正确使用 JPA。

让人们正确使用 JPA:这就是 JHipster 不会纠正这个问题的原因。您有很多方法可以解决这个问题,可以使用热切关系,也可以使用事务和 Spring 服务。在我看来,这就是应该使用 JPA 和 Spring 控制器的方式。