Hibernate HQL与列表getter

时间:2009-02-05 22:28:57

标签: java hibernate annotations hql

我有一个Hibernate实体,其getter被映射为@OneToMany:

@Entity
class Parent extends BaseParent {

    @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
    public List<Child> getChildren() {
        return super.children;
    }

    public void setChildren(List<Child> list) {
        super.children = list;
    }
}

当我尝试执行某些HQL时:

select p 
from Parent p 
left join p.children c
where c.name='foobar'

我得到以下异常:

org.springframework.orm.hibernate3.HibernateQueryException: could not resolve property: children of: ....Parent

如果我将@OneToMany注释放在受保护字段上,则查询有效。我怎样才能使这个注释可以放在getter上?

4 个答案:

答案 0 :(得分:1)

您可能遇到与注释中的字段和方法混合相关的问题。例如,如果你的父类BaseParent中有@Id注释,那么Hibernate默认会查看字段而不是方法。

所以基本上如果你有这样的东西:

public class BaseParent {
    @Id
    private Integer id;

    protected List<Child> children;
}

public class Parent extends BaseParent {
    @ManyToOne
    public List<Child> getChildren() {super.getChildren();} 
}

Hibernate在确定@ManyToOne注释时会遇到问题。此外,这可能解释了为什么在父类的字段中添加注释使其工作。

在上面提到的同一页面(http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html#d0e253)上,还有这一段:

  

取决于您是否注释   字段或方法,访问类型   Hibernate使用的将是field或   属性。 EJB3规范要求   你在元素上声明注释   将被访问的类型,即   如果使用属性,则为getter方法   访问,如果您使用字段的字段   访问。 混合使用EJB3注释   这两个领域和方法都应该是   避免即可。 Hibernate会猜测   从@Id的位置访问类型   或@EmbeddedId。

所以,为了让它起作用,你可能想要选择一个或另一个(字段与方法)并保持一致。这样,你就不会遇到这些“奇怪的”休眠问题。

无论如何,希望这是有帮助的。

答案 1 :(得分:0)

我建议阅读注释的Hibernate文档中的以下部分:

http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html#d0e253

在这种情况下,你可以在类级别添加一个@AccessType(“property”)注释,告诉Hibernate扫描这个类的getter。

如果不起作用,请阅读文档,看看是否有更适合您特定问题的内容。在没有看到整个实体层次结构的情况下,很难给出确切的答案。

答案 2 :(得分:0)

是的,我需要@AccessType(“property”)注释。但第二个答案也是正确的:我现在遇到了关联问题。这是一个很好的信息,感谢您的帮助!

答案 3 :(得分:0)

如果@OneToMany注释中有“mappedBy”属性,则表示您将具有双向映射。您需要在孩子身上获得/设置或填写“父母”字段。例如:

@Entity
public class Parent {
    @OneToMany(mappedBy="parent")
    public Set<Child> getChildren() {
    ...
}

@Entity
public class Child{
    @ManyToOne
    public Parent getParent() {
    ...
}

请参阅:http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/#d0e1177