【问题标题】:JpaRepository Interface - No property owner foundJpaRepository 接口 - 未找到财产所有者
【发布时间】:2016-02-17 14:53:54
【问题描述】:

尽管我认为一切正常,但我遇到了一个奇怪的错误。

宠物类:

@Entity
public class Pet {

    @Id
    @GeneratedValue
    private long id;
    ....
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "owner_id")
    private PetOwner petOwner;
}

宠物主人

@Entity(name = "pet_owner")
public class PetOwner extends User{
     ...
    @OneToMany(cascade = CascadeType.ALL,mappedBy = "petOwner")
    private List<Pet> pets;
}

宠物仓库

@Repository
public interface PetRepository extends JpaRepository<Pet, Long> {
    List<Pet> findByOwner(PetOwner owner);
}

如您所见,我想获得一份动物清单,并提供给主人。在应用程序运行期间得到错误:

org.springframework.beans.factory.BeanCreationException: 错误 创建名为“petRepository”的bean:调用init方法 失败的;嵌套异常是 org.springframework.data.mapping.PropertyReferenceException:否 找到宠物类型的所有者!

为什么会出现这个错误?

【问题讨论】:

    标签: spring jpa spring-data spring-data-jpa


    【解决方案1】:

    由于您将字段命名为petOwner,因此您应该使用findByPetOwner 方法名称而不是findByOwner

    @Repository
    public interface PetRepository extends JpaRepository<Pet, Long> {
        List<Pet> findByPetOwner(PetOwner owner);
    }
    

    Spring Data JPA 尝试从 查询方法名称 构造特定于存储的查询。一般的方法是从方法名称中删除一组给定的已知前缀(例如find...Byget...By),并使用Property Expressions 解析方法的其余部分(例如petOnwer,在您的情况下)和Clauses 的集合,例如 TopDistinctOrderBy。这些属性表达式只能引用托管实体的直接属性。在您的情况下,由于您的属性名称是 petOwner,因此您不能使用 owner 或除 petOwner 之外的任何内容。你可以阅读更多关于这个概念的信息here

    【讨论】:

    • 好的。它正在工作。你现在能解释一下为什么吗?我以为这是方法的名字,不依赖于Bean的名字
    • 谢谢。我明白了