我是Spring,Hibernate,JPA及其API的新手。我创建了一个@RestController
,相关方法就像
@GetMapping("/user")
public ResponseEntity getListItemById(){
UserTypeEntity entity = userTypeRepository.findFirstByUserTypeId(1);
return ResponseEntity.ok().body(entity);
}
UserTypeEntity
具有2个懒惰吸气剂,
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id", referencedColumnName = "user_id", nullable = false)
public UserEntity getUserByUserId() {
return userByUserId;
}
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_type_list_item_id", referencedColumnName = "list_item_id", nullable = false)
public ListItemEntity getListItemByUserTypeListItemId() {
return listItemByUserTypeListItemId;
}
的所有属性ListItemEntity
和UserEntity
是null
,直到并且除非我使用JOIN FETCH
的查询。我已经检查和验证了一个。
(任何有经验的人都可能熟悉)
看起来像下面。
下面是我使用以获得样本响应,
(对不起,由于数据响应大,它甚至无法格式化,尽管我在每个表中只有一行。它是无限递归(StackOverflowError))
一切最终加载。我无法确定这里到底出了什么问题。为什么加载了这些懒惰的null属性,却得到了这个奇怪而模糊的响应?我已经浪费了整整一天在此,plz帮助拿到了这一点。
答案 0 :(得分:0)
将注释从getter移至字段声明,您将看到一致的结果。
编辑后: @ShreeKrishna是我的意思。现在,我可以提供明确的解释,这是预期的行为。调试器会向您显示实际是什么字段,哪些是字段,并且因为您的惰性初始化触发器是在GETTER方法上,而不是在字段上,所以它将为null。因此,只要您将通过getter而不是直接访问来访问属性,就不必关注调试器向您显示的内容了。