【问题标题】:Hibernate HQL with list getters使用列表获取器的休眠 HQL
【发布时间】:2009-02-05 22:28:57
【问题描述】:

我有一个 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 上?

【问题讨论】:

    标签: java hibernate annotations hql


    【解决方案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。

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

    无论如何,希望对您有所帮助。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          当您在@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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-07-07
            • 2019-07-16
            • 2013-12-27
            • 1970-01-01
            • 1970-01-01
            • 2018-07-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多