JPA Repository.findById()返回null,但该值存在于db上

时间:2019-07-16 03:02:01

标签: java jpa spring-data-jpa

我正在使用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数据不为空时。

3 个答案:

答案 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