我有两个班级:
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会以这种方式运行。
由于
答案 0 :(得分:0)
因为您在任何Criteria,Restriction或HQL中添加的字符串实际上不是脚本语言(例如SQL)。 Hibernate有一个复杂的机制,可以根据你的输入进行反射调用。
所以,如果你有一天结束,那么:
session.createCriteria(Contact.class).add(Restrictions.eq("owner.Id", 2)).list();
Hibernate确实会为Contact
类创建一个对象,该对象将有一个名为owner
的对象,并通过Id
调用getId()
(区分大小写),因为您添加了注释关于方法。
简单地说这就是为什么......