0

我希望能够为同一个域对象使用不同的实体定位器。我使用Twig它,它可以选择完全或部分加载对象。当我运行 lite 请求fetchRangeLite时,使用定位器TwigLocator而不是TwigLiteLocator. 我目前的实现是:

代理

@ProxyFor(value = MyDomain.class, locator = TwigLocator.class)
public interface MyDomainProxy extends EntityProxy {}

@ProxyFor(value = MyDomain.class, locator = TwigLiteLocator.class)
public interface MyDomainLiteProxy extends EntityProxy {}

要求

@Service(value = MyDao.class, locator = DaoServiceLocator.class)
public interface MyRequest extends RequestContext {
    Request<List<MyDomainProxy>> fetchRange(Integer start, Integer length);
    Request<Integer> getCount();
    Request<List<MyDomainLiteProxy>> fetchRangeLite(Integer start, Integer length);
}

public List<MyDomain> fetchRange(Integer start, Integer length) {
  ...   
}

public List<MyDomain> fetchRangeLite(Integer start, Integer length) {
  ...   
}

我期待使用 lite 定位器,但事实并非如此。那么 RF 如何为特定的域类型选择它应该使用的定位器呢?

更新

我的域对象由列表列表组成。

public class MyDomain extends DatastoreObject {
  private List<A> a;
}

public class A {
  private List<B> b;
}

当我的MyDomain对象的代理从服务器发送到客户端时,Twig还会加载所有A' 和所有B',这需要时间。我只对MyDomain对象中的属性感兴趣,这就是我想使用“lite”定位器的原因。

树枝定位器

@Override
public DatastoreObject find(Class< ? extends DatastoreObject> clazz, Long id) {
    ObjectDatastore myDatastore = datastoreProvider.get();
    DatastoreObject object = myDatastore.load(clazz, id);
    return object;
}

TwigLite 定位器

@Override
public DatastoreObject find(Class< ? extends DatastoreObject> clazz, Long id) {
    ObjectDatastore myDatastore = datastoreProvider.get();
    myDatastore.setActivationDepth(0);
    DatastoreObject object = myDatastore.load(clazz, id);
    return object;
}

myDatastore.setActivationDepth(0);告诉数据存储仅加载其中的属性MyDomain,而不加载子级别(列表)属性。

DAO 实现是相同的,因此两个代理的 ID 和版本相同。

4

1 回答 1

0

我不确定为什么 RF 不使用“lite”定位器,但我不确定为什么它也可能是一个问题:无论使用哪个代理,MyDomain 的 ID 和版本都不应该相同吗?

实际上,我不明白为什么在这种情况下您确实需要两个不同的定位器:“完整”或“精简”提取是在您的 DAO 中完成的,而不是在定位器中。拥有两个不同定位器的唯一原因是实现find不同,当代理从客户端发送到服务器时(find也被默认实现使用,isLive但通常最好用您自己的实现覆盖它,除非默认一个已经是“最佳优化”的一个find(obj.getClass(), getId(obj)) != null:)

于 2011-07-16T11:20:52.980 回答