Java 收集/查找表的GWT RequestFactory、ValueProxy或EntityProxy

Java 收集/查找表的GWT RequestFactory、ValueProxy或EntityProxy,java,gwt,requestfactory,Java,Gwt,Requestfactory,我不确定在RequestFactory中处理收集/查找表的最佳实践是什么 例如,如果我有以下两个域对象: @Entity public class Experiment { private Long id; private String name; @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE}) private UnitOfMeasure unitOfMeasure; publi

我不确定在
RequestFactory
中处理收集/查找表的最佳实践是什么

例如,如果我有以下两个域对象:

@Entity
public class Experiment  {
    private Long id;
    private String name;

    @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
    private UnitOfMeasure unitOfMeasure;

    public Experiment() { }

    public String getName() {
        return name;
    }
    public Long getId() {
        return id;
    }
    public void setName(String name) {
        this.name = name;
    }

    public UnitOfMeasure getUnitOfMeasure()  {
        return unitOfMeasure;
    }

    public void setUnitOfMeasure(UnitOfMeasure unitOfMeasure)  {
        this.unitOfMeasure = unitOfMeasure;
    }
}

@Entity
public class UnitOfMeasure  {
    private Long id;
    private String unit_type;

    public UnitOfMeasure() { }

    public String getUnitType() {
        return unit_type;
    }
    public Long getId() {
        return id;
    }
    public void setUnitType(String unitType) {
        this.unit_type = unitType;
    }
}
这是
实验
测量单位
之间的正常单向1:n关系,使用
实验
表中的外键。
我有少量不同的
UnitOfMeasure
实例,它们通常不会改变

web应用程序提供了一个视图,用户可以在其中更改
实验
实例的某些属性。该视图使用
编辑器框架
。为了更改特定
实验的
测量单位
,我使用
值列表框
并呈现
单位类型
属性

因为可用的
UnitOfMeasure
实例列表是静态的,所以我使用
AutoBeanFactory
创建一个json字符串,将其放入HTML主机页,并在应用程序启动期间对其进行解析(与表值等所有其他集合相同),并将其存储在一个单例类实例中(
AppData
)我将其传递给“setAcceptableValues”

目前,我从
EntityProxy
派生出
UnitOfMeasureProxy
,但为了用
AutoBeanFactory
对其进行解码/编码,我必须用
EntityProxy类别
对工厂进行注释。不知何故,我怀疑
ValueProxy
更合适。
但是,使用
ValueProxy
当我更改特定
实验的
UnitOfMeasure
时,整个
ValueProxy
实例将通过有线传输。
但是,从数据库的角度来看,只需要更改
实验
表中foreignkey的值


那么,对于类似集合的表和子值,什么是最佳实践(
ValueProxy
vs
EntityProxy
)呢?

在许多情况下,对其他实体的引用最好使用它们的ID而不是
EntityProxy
本身建模(这是有争议的,但我认为对于服务器端代码,或者任何跨越工作单元边界的代码——JPA EntityManager生命周期、Hibernate会话等——也是如此)

顺便说一句,序列化RequestFactory代理的正确方法是使用。

如果您有
ValueProxy
s列表,请确保使用GWT 2.5.0-rc1(请参阅)

感谢使用
ProxySerializer
的提示。我不知道这一点。但是,如果我仅通过引用的ID对引用进行建模,这不完全违背
ORM层
/
请求工厂
的目的吗?在
Person
Address
的传统示例中,如果我只对
地址
通过ID而不是实体本身,我必须确保在我想要显示地址时手动传输地址?同样的事情也适用于后端?如果我想轻松地从一个人到另一个地址进行遍历怎么办?只有ID我才能从数据库中获取它?您可以将关系映射为只读,并且id是可写的;即
AddressProxy getAddress()
int getAddressId();void setAddressId(int id)
。但是,在Person/Address用例中,它不太可能是跨会话的;这与
UnitOfMeasureProxy
的用例不同(在应用程序的整个生命周期中都保存在缓存中)啊,好的,我明白了。我想我可以对像子值这样的集合做同样的事情(
UnitOfMeasureProxy
)在应用程序启动期间加载一次,并且无论父实体是什么,都是静态的。在这种情况下,我可能还会对实际实体使用getter,因为我已经缓存/加载了所有可用类型的列表。在这种情况下,我可能可以使用普通的
ListBox
而不是
ValueListBox