#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();
}