我希望能够为同一个域对象使用不同的实体定位器。我使用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);
}
DAO
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
个需要时间。我只对@Override
public DatastoreObject find(Class< ? extends DatastoreObject> clazz, Long id) {
ObjectDatastore myDatastore = datastoreProvider.get();
DatastoreObject object = myDatastore.load(clazz, id);
return object;
}
对象中的属性感兴趣,这就是我想使用“精简”定位器的原因。
TwigLocator
@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;
}
TwigLiteLocator
myDatastore.setActivationDepth(0);
MyDomain
告诉数据存储区仅加载{{1}}中的属性,而不加载次级(List)属性。
DAO实现是相同的,因此两个代理的ID和版本都是相同的。
答案 0 :(得分:0)
我不确定为什么RF没有使用“精简”定位器,但我不确定为什么它也可能是一个问题:不管代理是哪一个,MyDomain的ID和版本都不一样使用
实际上,我不明白为什么在这种情况下你确实需要两个不同的定位器:“完整”或“精简”抓取在DAO中完成,而不是在定位器中完成。拥有两个不同定位器的唯一原因是以不同方式实现find
,当代理从客户端发送到服务器时(find
也被默认实现使用isLive
但是通常最好用你自己的实现来覆盖它,除非默认的那个已经是“最优化的”:find(obj.getClass(), getId(obj)) != null
)