2009-02-05 2 views
1

у меня есть объект Hibernate, с добытчиком, который отображенные как @OneToMany:Hibernate HQL с списком геттерами

@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 аннотацию на защищаемом поле, запрос работает. Как я могу заставить это работать так, чтобы аннотация могла быть помещена на геттер?

ответ

0

Я рекомендую прочитать следующий раздел в документации Hibernate для аннотаций:

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

В этом случае, вероятно, можно добавить @AccessType («свойство») аннотацию на уровне класса, который говорит Спящий режим для сканирования геттеров для этого класса.

Если это не сработает, прочитайте документацию, чтобы узнать, есть ли что-то, что больше подходит для вашей конкретной проблемы. Трудно дать вам точный ответ без просмотра всей иерархии сущностей.

1

У вас могут возникнуть проблемы, связанные с смешиванием полей и методов в ваших аннотациях. Например, если у вас есть аннотация @Id в родительском классе BaseParent, то 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.

Итак, чтобы заставить его работать, вы, вероятно, захотите выбрать тот или иной метод (поле vs) и быть последовательным. Таким образом, вы не столкнетесь с этими «странными» проблемами спячки.

В любом случае, надеюсь, что это будет полезно.

0

Да, мне нужна аннотация @AccessType ("property"). Но второй ответ был также верным: у меня теперь проблемы с ассоциацией.Это отличная информация, спасибо за помощь!

0

Если у вас есть свойство «mappedBy» в аннотации @OneToMany, это означает, что у вас будет отображение двунаправленное. Вы должны иметь 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