Spring ROO GWT按参考选择

时间:2011-09-29 06:21:00

标签: gwt persistence spring-roo

我使用以下实体创建了一个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但它仍然无法正常工作。

任何人都知道这是什么问题?

2 个答案:

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