RequestFactory Entity的参数:List <ofotherentity>在客户端上为null。在服务器上没问题

时间:2015-11-23 14:26:10

标签: java gwt requestfactory

我正在学习RequestFactory。我有一个简单的例子。现在我想从下面为RF实现这些实体:

服务器包

@Entity
public class Pizza implements Identifiable, Versionable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Version
    private Long version;
    private String name;
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Ingredient> ingredients;
    /* Getters and Setters */
}

@Entity
public class Ingredient implements Identifiable, Versionable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Version
    private Long version;
    private String name;
    private boolean vegan;
    /* Getters and Setters */
}

以下是DAO的{​​{1}}课程:

Pizza Entity

共享包

我为这些课写了代理:

@Override
public List<Pizza> get() {

    CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
    CriteriaQuery<Pizza> q = cb.createQuery(Pizza.class);
    Root<Pizza> c = q.from(Pizza.class);
    q.select(c);

    TypedQuery<Pizza> query = JPA.em().createQuery(q);
    List<Pizza> results = query.getResultList();

    for(Pizza p: results) {
        for(Ingredient i: p.getIngredients()) {
            logger.info(i.getName());
        }
    }
    return results;
}

RF相关接口:

@ProxyFor(value = Pizza.class, locator = PizzaLocator.class)
public interface PizzaProxy extends EntityProxy {
  public Long getId();
  public String getName();
  public void setName( String name );
  public Long getVersion();
  public List<IngredientProxy> getIngredients();
  public void setIngredients( List<IngredientProxy> ingredients )
}

@ProxyFor(value = Ingredient.class)
public interface IngredientProxy extends EntityProxy {
    public void setId(Long id);
    public Long getId();
    public Long getVersion();
    public void setVersion(Long version);
    public String getName();
    public void setName(String name);
    public boolean isVegan();
    public void setVegan(boolean vegan);
}

客户端软件包

以下是我从服务器获取数据的方式:

public interface RequestFactoryServices extends RequestFactory {
      PizzaRequest pizzaRequest();
}

@Service(value = PizzaDao.class, locator = DaoLocator.class)
public interface PizzaRequest extends RequestContext {
    Request<PizzaProxy> findById( Long id );
    Request<Void> save( PizzaProxy pizza );
    Request<List<PizzaProxy>> get();
}

正如您在List<PizzaProxy> pizzas = new LinkedList<PizzaProxy>(); PizzaRequest context = createFactory().pizzaRequest(); context.get().to(new Receiver<List<PizzaProxy>>() { @Override public void onSuccess(List<PizzaProxy> response) { for(PizzaProxy p: response) { RootPanel.get().add(new Label( p.getId() + " " + p.getName() + ", " + p.getVersion() + ", " + p.getIngredients() )); } } }).fire(); 方法DAO中所看到的那样,我正在打印有关成分的记录器信息。在服务器端,一切正常。

问题在于,当我致电get()时,我收到的是p.getIngredients(),而不是null的列表。

是否发生了因为我没有IngredientsProxies实体的Dao和Locator类?

请帮忙。

答案: 实体关系

相关实体的更改可以保留在单个请求中。例如,来自GWT trunk中的DynatableRF示例应用程序的代码同时创建一个新的Person和Address:

PersonRequest context = requestFactory.personRequest(); AddressProxy address = context.create(AddressProxy.class); PersonProxy person = context.create(PersonProxy.class); person.setAddress(地址); context.persist()使用(人).fire(...)。 RequestFactory在单个请求中自动发送整个对象图。在这种情况下,服务器上Person.persist()的实现还负责持久保存相关地址,这可能会也可能不会自动发生,具体取决于ORM框架以及如何定义关系。请注意,RequestFactory当前不支持嵌入式对象(@Embedded在各种ORM框架中),因为它希望每个实体都独立存在并拥有自己的ID。

查询服务器时,RequestFactory不会自动填充对象图中的关系。为此,请对请求使用with()方法,并将相关属性名称指定为String:

请求findReq = requestFactory.personRequest()。find(personId).with(“address”); 还必须使用with()方法来检索具有扩展ValueProxy的类型的任何属性。 with()方法采用多个String参数,因此您可以一次指定多个属性名称。要指定嵌套属性,请使用点表示法。把它们放在一起,你可能有

请求findReq = find(personId).with(“phone”,“address.city”,“address.zip”)

1 个答案:

答案 0 :(得分:1)

默认情况下,gwt在获取对象时不附加集合实体。你需要在你的rf请求中使用.with(&#34; ingredients&#34;)。确保您的披萨类中有getIngredients方法。 rf请求上下文将使用它来获取成分。如果你从hibernate这样的东西中获取它,你可能还需要确保打开一个事务。这将确保rf上下文在检索披萨的成分时可以使用附加实体。

请注意,您不想使用with(&#34; getIngredients&#34;)rf上下文将正确调用get方法。

context.get().with("ingredients").fire(new Receiver<>)