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
vsEntityProxy
)呢?在许多情况下,对其他实体的引用最好使用它们的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
。