我正在使用JPA开发Spring引导项目。
我想知道的是repository.findById(id)方法返回null, 而数据库中有数据。
函数save()
和findAll()
正常工作。
当我在junit测试环境上运行相同的代码时,它完全起作用了。
如果数据是经过硬编码的,例如memberRepository.findById("M001");
,则可以正常工作。
这是我的模特
@Entity
@Table(name="df_member")
public class DfMember {
@Column(name="member_type")
private String memberType;
@Id
@Column(name="id")
private String id;
...columns...
...Getters/Setters.....
这是我的控制器
@ResponseBody
@RequestMapping(value="/checkIdDuplicate", method=RequestMethod.POST)
public boolean checkIdDuplicate(@RequestBody String id) {
return memberService.isExistByUserId(id);
}
memberService.isExistByUser()
public boolean isExistByUserId(String id) {
Optional<DfMember> member = memberRepository.findById(id);
return member.isPresent();
}
存储库
public interface MemberRepository extends CrudRepository<DfMember, String> {
}
必须有返回成员对象,但它为空。
+++++),当sysout数据不为空时。
答案 0 :(得分:5)
虽然OP解决了他的问题,但我必须对相同的问题添加答案,但原因有所不同,因为我确信在经过Hibernate(5.4 .18)尝试/捕获,在水化过程中抛出EntityNotFoundException
时,即使实体存在,并且成功水合,findBy仍返回null。 这是因为相关的引用实体不存在,而Hibernate希望它存在
例如,我有两个实体 Unit 和 Impprovement ,我在其中存储ID为5的单元,以获得ID为0
的改进(不存在),则unitRepository.findById()
返回null,而不是ID为5的Unit实体。
@Entity
@Table(name = "units")
public class Unit {
@ManyToOne(fetch = FetchType.LAZY)
@Fetch(FetchMode.JOIN)
@JoinColumn(name = "improvement_id")
@Cascade({ CascadeType.MERGE, CascadeType.PERSIST, CascadeType.DELETE })
private Improvement improvement;
}
发生这种情况的原因是因为导入脚本使用 0 作为 improvement_id 的值,而不是原始的NULL。
提示:请小心禁用导入脚本中的外键检查
最诚挚的问候
答案 1 :(得分:3)
您必须将@RequestBody
更改为@RequestParam
。请按如下所示更新您的控制器代码。
@ResponseBody
@RequestMapping(value="/checkIdDuplicate", method=RequestMethod.POST)
public boolean checkIdDuplicate(@RequestParam String id) {
return memberService.isExistByUserId(id);
}
答案 2 :(得分:1)
我想用@Alexpandiyan答案添加一些内容。而不是先通过ID查找记录并检查其是否存在。您可以使用如下所示的预定义函数existsById
直接在数据库中检查ID是否存在。
public interface MemberRepository extends CrudRepository<DfMember, String> {
boolean existsById(String id);
}
更新的会员服务功能memberService.isExistByUser()
。
public boolean isExistByUserId(String id) {
return memberRepository.existsById(id);
}
请参阅文档https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#new-features.1-11-0