例如,我有3个相关的表,并且我在这些表填充的不同页面中有selectonemenus。要用对象填充selectonemenus,我需要转换器。在编写转换器时,考虑内存消耗的正常方法是什么?我的意思是转换器中的值应该是什么?
答案 0 :(得分:1)
我的意思是转换器中的值应该是什么?
无。转换器本身不应该保持任何状态(当然期望注入的实体服务/ DAO)。
getAsString()
必须直接返回实体本身已知的实体的唯一标识符。即它是实体本身的属性,可以唯一地表示为String
。
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
Entity entity = (Entity) value;
return entity.getId() != null ? String.valueOf(entity.getId()) : null;
}
getAsObject()
必须只返回由其唯一标识符关联的实体。这通常是通过从服务/ DAO层获取它来完成的。
@Override
public String getAsObject(FacesContext context, UIComponent component, String value) {
Long id = Long.valueOf(value);
return entityService.find(id);
}
在getAsObject()
中使用service / DAO的另一种方法是从<f:selectItems>
获取它,以便可以避免任何不必要的DB调用。另请参阅Avoid extra DB reads in the getAsObject method of converter class by caching data client side?