使用带有两个实体的SpringBoot 1.5.15.BUILD-SNAPSHOT
和data-jpa
创建一个简单的spring boot项目。
父实体
spring-mvc(web)
子实体
@Entity
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "parent_id")
private Collection<Child> children;
//Getter & Setter remove for brevity
}
每当调用用于提取所有@Entity
public class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
}
数据的端点时,也会返回子数据,但是据我的理解,默认情况下fetchType为LazyLoading。
以下用于获取数据的Spring Mvc剩余代码
Parent
只有延迟@RestController
@RequestMapping("test")
public class Controller {
@Autowired
ParentRepository parentRepository;
@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET)
public ResponseEntity<Collection<Parent>> findAll(HttpServletRequest request) {
List<Parent> parents = parentRepository.findAll();
return new ResponseEntity<>(parents, HttpStatus.OK);
}
}
数据而不是带有子数据收集的数据应该被延迟加载,这样才应该发生并且应该发生。
我该如何阻止这种总是渴望加载孩子的不良行为。
N.B:我尝试将Parent
设置为LazyLoad,尽管当我调用'/ test'时,也会获取子数据
答案 0 :(得分:0)
最后,我设法阻止Jackson
为我拉动延迟加载的数据。
要做到这一点 添加以下Maven依赖项
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
<version>2.9.6</version>
</dependency>
然后像这样子类ObjectMapper
并根据您使用的休眠版本注册休眠模块。我正在使用休眠5,所以我这样做了
public class HibernateAwareObjectMapper extends ObjectMapper {
public HibernateAwareObjectMapper() {
registerModule(new Hibernate5Module());
}
}
最后添加一个Bean
@Bean
public ObjectMapper objectMapper(){
return new HibernateAwareObjectMapper();
}
使用上面的代码,延迟加载的属性不会自动初始化。