gpt4 book ai didi

java - RequestFactory实体的参数: List is null on client.在服务器上是可以的

转载 作者:行者123 更新时间:2023-12-01 21:59:16 25 4
gpt4 key购买 nike

我正在学习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 */
}

这是 Pizza EntityDAO 类:

@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;
}
<小时/>

共享包

我为这些类编写了代理:

@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);
}

射频相关接口(interface):

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();
<小时/>

正如您在 get() 方法中的 DAO 类中看到的那样,我正在打印有关成分的记录器信息。在服务器端一切正常。

问题是,当我调用 p.getIngredients() 时,我得到的是 null,而不是 IngredientsProxies 列表。

发生这种情况是因为我没有 Ingredients 实体的 Dao 和 Locator 类吗?

请帮忙。

答案:实体关系

对相关实体的更改可以保留在单个请求中。例如,GWT 主干中 DynatableRF 示例应用程序中的此代码同时创建一个新的人员和地址:

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

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

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

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

最佳答案

默认情况下,RequestFactory 不会递归地导致获取发生,以节省数据库调用和线路空间。

如果您需要 ingredients 属性,则必须请求它。而不是

context.get().to(...

在其中添加对 Request.with(String... propertyRefs) 的调用,并指定您想要的成分:

context.get().with("ingredients").to(...
<小时/>

没有 Ingredients 类型的定位器可能最终会很重要,但是如果您尝试以 Locator 定位器的方式使用这些对象,则会出现特定错误code> 或类中的静态方法是必需的。您不需要为其指定特定的 DAO 和 ServiceLocator 类,除非您最终为其创建 RequestContext 类型。

关于java - RequestFactory实体的参数: List<OfOtherEntity> is null on client.在服务器上是可以的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33873399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com