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

将向我抛出“无法解析 property owner.Id”异常。

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

谢谢

4

1 回答 1

0

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

所以,如果你有:

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

Hibernate 确实会为类创建一个对象,因为您在方法上添加了注释,所以Contact该对象将具有一个调用owner和调用Id(区分大小写)的对象。getId()

简而言之,这就是为什么...

于 2013-04-12T01:53:49.860 回答