我有一个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上?
答案 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文档中的以下部分:
在这种情况下,你可以在类级别添加一个@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