2016-02-17 60 views
0

即使我認爲一切都看起來確定,但我得到了一個奇怪的錯誤。JpaRepository接口 - 沒有財產所有者發現

寵物類:

@Entity 
public class Pet { 

    @Id 
    @GeneratedValue 
    private long id; 
    .... 
    @ManyToOne(cascade = CascadeType.PERSIST) 
    @JoinColumn(name = "owner_id") 
    private PetOwner 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: Error creating bean with name 'petRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property owner found for type Pet!

爲什麼會出現此錯誤?

回答

2

既然你命名你的領域作爲petOwner,你應該使用findByPetOwner方法名稱,而不是findByOwner

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

春數據JPA試圖從查詢方法名構建一個特定的商店查詢。一般的方法是從方法名中刪除一組給定的衆所周知的前綴(例如find...Byget...By)和解析使用Property Expressions方法的其餘部分(例如petOnwer,你的情況),並設置ClausesTopDistinctOrderBy。這些財產表達式僅可以指被管實體的直接財產。在你的情況下,因爲你的房產名稱是petOwner,你不能使用ownerpetOwner以外的任何東西。你可以閱讀更多關於這個概念here

+0

好的。它正在工作。你現在可以解釋爲什麼嗎? 我以爲這是方法的名稱,並不取決於豆的名字 – Adamo

+0

謝謝。我明白 – Adamo