Spring ROO GWT Выбрать по ссылке

Я создал проект GWT Spring ROO со следующими объектами: Facture и ItemFacture.

ItemFacture содержит ссылку на счет-фактуру.

@RooJavaBean
@RooToString
public class ItemFacture {

    @ManyToOne
    private Facture facture;
...

Это код для Facture :

@RooJavaBean
@RooToString
@RooEntity
public class Facture {

    private String nom;
    private String type;
}

и все шло нормально, пока я не захотел создать пользовательский поисковик, который выбирает все ItemFactures, содержащие определенную Facture:

@SuppressWarnings("unchecked")
public static List<ItemFacture> findByFacture(Facture facture) {

    Query q = entityManager().createQuery("SELECT o FROM ItemFacture AS o WHERE o.facture = :facture");
    q.setParameter("facture", facture);

    return q.getResultList();
}

Когда я пытаюсь выполнить этот поиск, он дает мне эту ошибку:

Ошибка сервера: поле "facture" не существует в com.test.ItemFacture или не является постоянным; вложенным исключением является javax.persistence.PersistenceException: поле «facture» не существует в com.test.ItemFacture или не является постоянным

Я создал несколько пользовательских поисковиков, и каждый из них работал нормально, кроме этого.

Я попытался добавить @Persistent в поле и @PersistenceCapable(identityType = IdentityType.APPLICATION) в Facture, но это все равно не работает.

Кто-нибудь знает, в чем проблема?


person Mathew    schedule 29.09.2011    source источник
comment
Хотелось бы также увидеть код в классе Facture.   -  person bhagyas    schedule 29.09.2011
comment
Я добавил код для Facture. Но я пробовал с парой других сущностей, и ничего не получилось.   -  person Mathew    schedule 29.09.2011


Ответы (2)


я предполагаю, что причина, по которой это не работает, заключается в том, что класс ItemFacture не является @Entity, поэтому JPA не знает, что это поле существует. с аннотацией класса ItemFacture с помощью @RooEntity roo генерирует ItemFactures_Roo_Entity.aj (по умолчанию STS скрывает эти файлы в проводнике пакетов), который связывает аннотацию @Entity с вашим классом ItemFacture вместе с некоторыми другими вещами, делающими его ActiveRecord (http:/ /martinfowler.com/eaaCatalog/activeRecord.html)

person cproinger    schedule 30.09.2011
comment
Я добавил @Entity в ItemFacture и удалил декларацию @type: ItemFacture: @Entity; из ItemFacture_Roo_Entity.aj, но, к сожалению, он все еще не работает. - person Mathew; 30.09.2011

В AppEngine ссылки делаются с идентификатором объекта, на который делается ссылка. Таким образом, событие, если ItemFacture содержит фактуру и атрибутирует ее, фактически сохраняется как factureId.

Итак, метод записи таков:

@SuppressWarnings("unchecked")
public static List<ItemFacture> findByFacture(Facture facture) {

    Query q = entityManager().createQuery("SELECT o FROM ItemFacture AS o WHERE o.factureId = :facture");
    q.setParameter("facture", facture.getId());

    return q.getResultList();
}
person Mathew    schedule 15.10.2011