2013-04-11 72 views
0

我有兩個類:休眠無法解決財產資本值的名稱

public class User { 

    private int id; 
    private String Name; 
    private Set<Contact> Contacts = new HashSet<Contact>(); 

    @Id 
    @GeneratedValue 
    public int getId() { 
     return id; 
    } 

    ... 

    @OneToMany(mappedBy = "owner", cascade = CascadeType.ALL) 
    public Set<Contact> getContacts() { 
     return 
    } 
} 

public class Contact { 

    private int id; 
    private String nick; 
    private int age; 
    private User owner; 

    ... 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "UserId") 
    public User getOwner() { 
     return owner; 
    } 
} 

當我打電話:

session.createCriteria(Contact.class).add(Restrictions.eq("owner.id", 2)).list(); 

一切都很好,但如果我將用戶的「id」屬性名稱更改爲「Id」代碼編譯但是:

session.createCriteria(Contact.class).add(Restrictions.eq("owner.Id", 2)).list(); 

會拋出「無法解析屬性owner.Id」異常。

我知道在Java中,我應該用小寫字母來啓動一個變量名,但我只是想知道爲什麼Hibernate會以這種方式運行。

感謝

回答

0

因爲你在任何條件,限制添加或HQL是不是一個真正的腳本語言(如SQL)的字符串。 Hibernate有一個複雜的機制,可以根據你的輸入進行反射調用。

所以,在這一天結束時,如果您有:

session.createCriteria(Contact.class).add(Restrictions.eq("owner.Id", 2)).list(); 

休眠確實將創建一個對象Contact類,這將有一個對象調用owner以來通過getId()調用Id(區分大小寫)您在該方法上添加了註釋。

簡而言之,這就是爲什麼...