当前位置: 技术问答>java相关
EJB问题,请教一个好的方法!
来源: 互联网 发布时间:2015-02-21
本文导语: CMP中如何根据client需求动态地返回单条纪录的批量属性,举个例子: CustomerBean---->id,name,country,desc,....(tens of attibutes)---->我们不可能每次都set/get(对entity bean),可以用DAO全部返回,但是有时用不到这么多属性,可能只...
CMP中如何根据client需求动态地返回单条纪录的批量属性,举个例子:
CustomerBean---->id,name,country,desc,....(tens of attibutes)---->我们不可能每次都set/get(对entity bean),可以用DAO全部返回,但是有时用不到这么多属性,可能只是去其中几个做列表,全部取回--->overhead,怎么才能根据实际需求返回相应的属性而没有冗余呢?看到书上介绍,HashMap等动态的东西可以做到,BMP中不费力,但CMP中要用到Reflection API, 不会,忘高手指教,有代码最好!呵呵!
CustomerBean---->id,name,country,desc,....(tens of attibutes)---->我们不可能每次都set/get(对entity bean),可以用DAO全部返回,但是有时用不到这么多属性,可能只是去其中几个做列表,全部取回--->overhead,怎么才能根据实际需求返回相应的属性而没有冗余呢?看到书上介绍,HashMap等动态的东西可以做到,BMP中不费力,但CMP中要用到Reflection API, 不会,忘高手指教,有代码最好!呵呵!
|
可不可以这样:
HashMap getFields(Collection fieldCol)
{
HashMap map = new HashMap(fieldCol.size());
for (Iterator it = fieldCol; it.hasNext();)
{
String fName = (String)it.next();
try{
Method mt=cl.getMethod(fName,null ) ;
Class parameters[]=mt.getParameterTypes() ;
Class returntype=Classmt.getReturnType() ;
Class returnvalue=(returntype)=mt.invoke(cl,parameters) ;
}catch(Exception e){
//handler your exception
.....
}
//handler your return value and put in into "map"
.....
return map ;
}
return map;
}
HashMap getFields(Collection fieldCol)
{
HashMap map = new HashMap(fieldCol.size());
for (Iterator it = fieldCol; it.hasNext();)
{
String fName = (String)it.next();
try{
Method mt=cl.getMethod(fName,null ) ;
Class parameters[]=mt.getParameterTypes() ;
Class returntype=Classmt.getReturnType() ;
Class returnvalue=(returntype)=mt.invoke(cl,parameters) ;
}catch(Exception e){
//handler your exception
.....
}
//handler your return value and put in into "map"
.....
return map ;
}
return map;
}
|
不好意思少了一行代码
HashMap getFields(Collection fieldCol)
{
HashMap map = new HashMap(fieldCol.size());
for (Iterator it = fieldCol; it.hasNext();)
{
String fName = (String)it.next();
try{
Class cl=this.getClass(); //后来家的.
Method mt=cl.getMethod(fName,null ) ;
Class parameters[]=mt.getParameterTypes() ;
Class returntype=Classmt.getReturnType() ;
Class returnvalue=(returntype)=mt.invoke(cl,parameters) ;
}catch(Exception e){
//handler your exception
.....
}
//handler your return value and put in into "map"
.....
return map ;
}
return map;
}
HashMap getFields(Collection fieldCol)
{
HashMap map = new HashMap(fieldCol.size());
for (Iterator it = fieldCol; it.hasNext();)
{
String fName = (String)it.next();
try{
Class cl=this.getClass(); //后来家的.
Method mt=cl.getMethod(fName,null ) ;
Class parameters[]=mt.getParameterTypes() ;
Class returntype=Classmt.getReturnType() ;
Class returnvalue=(returntype)=mt.invoke(cl,parameters) ;
}catch(Exception e){
//handler your exception
.....
}
//handler your return value and put in into "map"
.....
return map ;
}
return map;
}
|
实际上 Entity Bean 在被 find 后也不会 load 所有的属性的。
我的理解是,建议 batch 取回多个属性的值(在一个 method invocation 中),而不是多次调用 getxxx() 方法。
所以你应该在 entity bean 上定义一个 HashMap getFields(Collection fieldCol)
在这个方法中根据传入的 fieldCol 分别调用 getxxx(),将其结果放入到 HashMap 中。
可以用 reflection 得到一个 generic 的方法,如果想偷懒:
ArrayList fields = new ArrayList(3);
fields.add("ID");
fields.add("COUNTRY");
fields.add("DESC");
HashMap getFields(Collection fieldCol)
{
HashMap map = new HashMap(fieldCol.size());
for (Iterator it = fieldCol; it.hasNext();)
{
String fName = (String)it.next();
if(fName.equals("ID"))
map.put(fName, getID());
else if (fName.equals("COUNTRY"))
map.put(fName, getCountry());
...
}
return map;
}
我的理解是,建议 batch 取回多个属性的值(在一个 method invocation 中),而不是多次调用 getxxx() 方法。
所以你应该在 entity bean 上定义一个 HashMap getFields(Collection fieldCol)
在这个方法中根据传入的 fieldCol 分别调用 getxxx(),将其结果放入到 HashMap 中。
可以用 reflection 得到一个 generic 的方法,如果想偷懒:
ArrayList fields = new ArrayList(3);
fields.add("ID");
fields.add("COUNTRY");
fields.add("DESC");
HashMap getFields(Collection fieldCol)
{
HashMap map = new HashMap(fieldCol.size());
for (Iterator it = fieldCol; it.hasNext();)
{
String fName = (String)it.next();
if(fName.equals("ID"))
map.put(fName, getID());
else if (fName.equals("COUNTRY"))
map.put(fName, getCountry());
...
}
return map;
}