1

我有一个 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 注释放在受保护的字段上,则查询有效。我怎样才能让它工作,以便可以将注释放在吸气剂上?

4

4 回答 4

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 使用的访问类型将是字段或属性。EJB3 规范要求您在将被访问的元素类型上声明注释,即,如果您使用属性访问,则为 getter 方法,如果您使用字段访问,则为字段。应避免在字段和方法中混合使用 EJB3 注释。Hibernate 会从@Id 或@EmbeddedId 的位置猜测访问类型。

因此,要让它发挥作用,您可能希望选择其中一个(字段与方法)并保持一致。这样,您就不会遇到这些“奇怪”的休眠问题。

无论如何,希望这会有所帮助。

于 2009-02-06T04:07:50.217 回答
0

当您在 @OneToMany 注释中有“mappedBy”属性时,这意味着您将拥有一个双向映射。您需要在孩子身上设置“父母”的 get/set 或字段。例子:

@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

于 2009-02-07T00:47:12.117 回答
0

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

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

在这种情况下,您可能可以在类级别添加 @AccessType("property") 注释,它告诉 Hibernate 扫描此类的 getter。

如果这不起作用,请阅读文档以查看是否有更适合您的特定问题的内容。如果没有看到整个实体层次结构,很难给你一个准确的答案。

于 2009-02-06T02:16:38.880 回答
0

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

于 2009-02-06T13:06:49.740 回答