Hibernate无法解析大写值名称的属性

时间:2013-04-11 15:06:35

标签: hibernate

我有两个班级:

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();

会抛出“无法解决财产所有者.Id”的例外情况。

我知道在Java中我应该用小写字母开始一个变量名,但我只是想知道为什么Hibernate会以这种方式运行。

由于

1 个答案:

答案 0 :(得分:0)

因为您在任何Criteria,Restriction或HQL中添加的字符串实际上不是脚本语言(例如SQL)。 Hibernate有一个复杂的机制,可以根据你的输入进行反射调用。

所以,如果你有一天结束,那么:

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

Hibernate确实会为Contact类创建一个对象,该对象将有一个名为owner的对象,并通过Id调用getId()(区分大小写),因为您添加了注释关于方法。

简单地说这就是为什么......