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

#gwt #persistence #spring-roo

#gwt #постоянство #spring-roo

Вопрос:

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

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

 @RooJavaBean
@RooToString
public class ItemFacture {

    @ManyToOne
    private Facture facture;
...
  

Это код для фактуры :

 @RooJavaBean
@RooToString
@RooEntity
public class Facture {

    private String nom;
    private String type;
}
  

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

 @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 .ПРИЛОЖЕНИЕ) к фактуре, но оно по-прежнему не работает.

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

Комментарии:

1. Хотелось бы также увидеть код в классе Facture.

2. Я добавил код для Facture. Но я попробовал с парой других объектов, и ничего не получилось.

Ответ №1:

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

Комментарии:

1. Я добавил «@Entity» в ItemFacture и удалил «declare @type: ItemFacture: @Entity;» из ItemFacture_Roo_Entity. aj но, к сожалению, это все еще не работает.

Ответ №2:

В AppEngine ссылки создаются с идентификатором ссылочного объекта. Таким образом, событие, если ItemFacture содержит и атрибут facture, фактически сохраняется как 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();
}