不可以得,在EJB中的远程方法中基本类型是按值传递,而对象是拷贝传递的。一端的修改不影响另外一端的状态。你可以用 一个collection集合来返回你需要的东西,前提是这些东西都必须是可序列化的,如果是返回远程对象还必须是继承了remote接口,也就是要符合RMI规范

解决方案 »

  1.   

    一下是我搜集的这个论坛一个牛人曾经发的帖子,你看看吧:
    相信很多人都有如此之困惑,得此解决方法不敢独享,公之于众,以利后来人。
    声明:此方法的至于彭璐大侠,彭大侠可能不常上网,这麽好的方法也不告诉我等之小虾米,只好代劳了,彭大侠的email不便公开,应该是金蝶的人吧。
    好了,不废话了,有两种方法:
    1、用vector:
    /**
    >    * Finds all EJBeans with a balance greater than a given amount.
    >    * Returns an Enumeration of found EJBean primary keys.
    >    *
    >    * @param balanceGreaterThan double Test Amount
    >    * @return                   Enumeration EJBean Primary Keys
    >    * @exception                javax.ejb.EJBException
    >    *                           if there is a communications or systems failure
    >    */
    >   public Enumeration ejbFindBigAccounts(double balanceGreaterThan) {
    >     log("ejbFindBigAccounts (balance > " + balanceGreaterThan + ")");
    >     Connection con = null;
    >     PreparedStatement ps = null;

    >     try {
    >       con = getConnection();
    >       ps = con.prepareStatement("select id from ejbAccounts where bal > ?");
    >       ps.setDouble(1, balanceGreaterThan);
    >       ps.executeQuery();
    >       ResultSet rs = ps.getResultSet();
    >       Vector v = new Vector();
    >       String pk;
    >       while (rs.next()) {
    >         pk = rs.getString(1);
    >         v.addElement(pk);
    >       }
    >       return v.elements();
    >     } catch (SQLException sqe) {
    >       log("SQLException: " + sqe);
    >       throw new EJBException (sqe);
    >     } finally {
    >       cleanup(con, ps);
    >     }
    >   }
    结论:不爽,不方便。2、RowSet
    RowSet tutorial chapter :
    http://developer.java.sun.com/developer/Books/JDBCTutorial/chapter5.htmlrowset是个interface,需要有东西去实现它,sun的规范中给了三个class:cachedrowset,jdbcrowset,webrowset,如果去查jdk1.4 doc和j2skee1.2,有rowset,却没有那三个class,一般的开发工具(至少我的wsad)中也是这样,所以需要下jdbc2.0 opt-pack:
    http://developer.java.sun.com/developer/earlyAccess/crs/下下来了再怎么办呢?
    装呗!
    怎么装呢?
    setup呀!
    没有呀?
    啊,没setup呀,sun干什么吃的,连setup都不做个,也太懒了吧。
    /////////////////////////////////
    哎,我们确实是都被ms惯坏了,看到只有jar,没setup就没辙了,大家好好想想,java最大的特性是什么,就是它的类库可以自由扩充呀,现在明白该怎么做了吧:1、解包,得到rowset.jar,放在哪随您的意,别丢了就行。
    2、在您的开发工具中增加一个路径,如:ROWSET_PATH对应:d:\jdk1.4\jre\rowset.jar(和1的路径对应就行)。
    3、右键您的工程文件,出现:property(大多数工具应该都有吧),加上rowset_path。
    4、在您的源文件中:import sun.jdbc.rowset.*;OK,搞定!下面就看您的了。(当然也可以把rowset压到jre里去)
    应该说rowset(其实主要是CachedRowSet)真的是个好东西,和ms ado的resultset和borland的tclientset非常相似,最大的好处是Cache功能!
    好了,看例子吧:
    /////////////server端/////////////
    package example4;import java.sql.*;
    import javax.sql.*;
    import sun.jdbc.rowset.*;
    import javax.naming.*;
    import javax.ejb.*;public class CoffeesBean implements SessionBean {   private SessionContext sc = null;
       private Context ctx = null;
       private DataSource ds = null;
       
       public CoffeesBean () {}
       
       public void ejbCreate() throws CreateException {       try {
               ctx = new InitialContext();
               ds = (DataSource)ctx.lookup("jdbc/CoffeesDB");
           }
           catch (Exception e) {
               System.out.println(e.getMessage());
               throw new CreateException();
           }
       }   public RowSet getCoffees() throws SQLException {
           
           Connection con = null;
    ResultSet rs;
           CachedRowSet crs;       try {
               con = ds.getConnection("webCustomer", "webPassword");
               Statement stmt = con.createStatement();
               rs =  stmt.executeQuery("select * from coffees");
               
               crs = new CachedRowSet();
               crs.populate(rs);
               // the writer needs this because JDBC drivers
               // don't provide this meta-data.
               crs.setTableName("coffees");
               
               rs.close();
               stmt.close();
           } finally {
               if (con != null) 
                   con.close();
           }
           return rset;
       }
       
       public updateCoffees(RowSet rs) throws SQLException {       Connection con = null;       try {
               CachedRowSet crs = (CachedRowSet)rs;
               con = ds.getConnection("webCustomer", "webPassword");
               // moves the changes back to the database
               crs.acceptChanges(con);
           } finally {
               if (con != null) 
                   con.close();
           }
       }   //
       // Methods inherited from SessionBean
       //
       
       public void setSessionContext(SessionContext sc) {
           this.sc = sc;
       }
       
       public void ejbRemove() {}
       public void ejbPassivate() {}
       public void ejbActivate() {}   
    }
    //////////////////client端//////////////
    package example4;import java.sql.*;
    import javax.sql.*;
    import sun.jdbc.rowset.*;
    import javax.naming.*;
    import javax.ejb.*;
    import javax.rmi.*;class CoffeesClient {   public static void main(String[] args) {       try {
               // init the bean
               Context ctx = new InitialContext();
               Object obj = ctx.lookup("ejb/Coffees");
               CoffeesHome coffeesHome = (CoffeesHome)
                   PortableRemoteObject.narrow(obj, CoffeesHome.class);
               Coffees coffees = coffeesHome.create();
               
               // get the rowset from the bean
               CachedRowSet rset = (CachedRowSet)coffees.getCoffees();           // find the Columbian coffee
               while (rset.next()) {
                   String coffeeName = rset.getString("COF_NAME");
                   if (coffeeName.equalsIgnoreCase(new String("Columbian"))) {
                       // columbian coffee has gone up 10%
                       rset.updateFloat("PRICE", 
                                        (float)(rset.getFloat("PRICE") * 1.10));
                       rset.updateRow();
                   }
               }           // finally send the updated back to the bean...
               System.out.println("Calling update method");
               coffees.updateCoffees((RowSet)rset);
           }
           catch (Exception e) {
               System.out.println(e.getMessage());
           }
       }
    }
    例子很简单就不多讲了。
    cheers.
    Robin
    12/27/2001Any question mailto:[email protected]
      

  2.   

    只能用返回值传递参数,而且这个返回值必须是可序列化的,Collection是不可序列化的,你需要用Vector或其他的实现类代替它