我正在用Spring和Hibernate JSF项目,除其他外有许多是遵循相同的模式Converter
S:实施实体的转换器,Java泛型
getAsObject
接收的字符串表示对象ID,将其转换为数字,并获取给定种的实体和给定idgetAsString
接收和实体,并返回转换为String
的对象的id
的代码基本上如下(省略检查)什么:
@ManagedBean(name="myConverter")
@SessionScoped
public class MyConverter implements Converter {
private MyService myService;
/* ... */
@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) {
int id = Integer.parseInt(value);
return myService.getById(id);
}
@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value) {
return ((MyEntity)value).getId().toString();
}
}
鉴于大量的Converter
S中的值为酷似本(除的MyService
当然MyEntity
的类型),我想知道是否值得使用一个通用转换器。 泛型的实现本身并不困难,但我不确定正确的方法来声明Beans。
一个可能的解决方案是:
1 - 写一般的实现,让我们称之为MyGenericConverter
,不含任何豆注释
2 - 写具体的转换器广告的子类的MyGenericConverter<T>
和注释它作为需要:
@ManagedBean(name="myFooConverter")
@SessionScoped
public class MyFooConverter implements MyGenericConverter<Foo> {
/* ... */
}
在写这个,我意识到,也许是不是真的需要一个通用的,所以也许我可以简单地写一个基类的两个方法的实现, d子类。
有几个非常重要的细节需要处理(比如我必须以某种方式抽象MyService
类),所以我的第一个问题是:是否值得花这个麻烦?
如果是这样,还有其他方法吗?
使用“ID”属性不建议在equals和hashCode方法中使用:他们建议使用Business key equal实现equals()和hashCode():https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/persistent-classes -equalshashcode.html复合ID如何? –