我正在学习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”)
答案 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<>)