【问题标题】:Why didn't jHipster project get LazyInitializationException in Controller?为什么 jHipster 项目在 Controller 中没有得到 LazyInitializationException?
【发布时间】:2017-03-09 20:41:54
【问题描述】:

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 spring-boot spring-data jhipster lazy-initialization


    【解决方案1】:

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

    来源:Spring Boot properties reference

    【讨论】:

      【解决方案2】:

      As jdubois mentioned 如果您在事务之外访问惰性关系,这对于 JPA 来说是“正常的”。

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

      我们只剩下两个选择:

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

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

      【讨论】:

        猜你喜欢
        • 2020-03-27
        • 1970-01-01
        • 2022-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-01
        • 2022-01-22
        • 1970-01-01
        相关资源
        最近更新 更多