为什么 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
.
As jdubois mentioned
这是 "normal" 与 JPA,如果您在事务之外访问惰性关系。
通常情况下,您应该使用带有事务的服务层。例如,UserService class 非常适合完成这项工作。
我们剩下的仅有的两个选项是:
使用视图模式中的打开会话。我不喜欢它,因为它向开发人员隐藏了问题:他应该正确使用 JPA。
让人们正确使用 JPA:这就是 JHipster 不会纠正这个问题的原因。您有很多方法可以解决这个问题,可以使用热切关系,也可以使用事务和 Spring 服务。在我看来,这就是应该使用 JPA 和 Spring 控制器的方式。
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
.
As jdubois mentioned 这是 "normal" 与 JPA,如果您在事务之外访问惰性关系。
通常情况下,您应该使用带有事务的服务层。例如,UserService class 非常适合完成这项工作。
我们剩下的仅有的两个选项是:
使用视图模式中的打开会话。我不喜欢它,因为它向开发人员隐藏了问题:他应该正确使用 JPA。
让人们正确使用 JPA:这就是 JHipster 不会纠正这个问题的原因。您有很多方法可以解决这个问题,可以使用热切关系,也可以使用事务和 Spring 服务。在我看来,这就是应该使用 JPA 和 Spring 控制器的方式。