我使用以下实体创建了一个GWT Spring ROO项目:Facture和ItemFacture。
ItemFacture包含对Facture的引用。
@RooJavaBean
@RooToString
public class ItemFacture {
@ManyToOne
private Facture facture;
...
这是Facture的代码:
@RooJavaBean
@RooToString
@RooEntity
public class Facture {
private String nom;
private String type;
}
一切都很顺利,直到我想创建一个自定义查找器,选择包含特定Facture的所有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.APPLICATION)添加到Facture但它仍然无法正常工作。
任何人都知道这是什么问题?
答案 0 :(得分:0)
我猜这个不起作用的原因是ItemFacture类不是@Entity,所以JPA不知道这个字段是否存在。使用@RooEntity roo注释ItemFacture类生成一个ItemFactures_Roo_Entity.aj(STS默认将这些文件隐藏在包浏览器中),它将ItemFacture类上的@Entity注释与其他一些内容连接起来,使其成为ActiveRecord(http:/ /martinfowler.com/eaaCatalog/activeRecord.html)
答案 1 :(得分:0)
在AppEngine中,使用引用对象的ID进行引用。所以 如果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();
}