你可将实体BEAN和会话BEAN分开来,这样即便于修改,也可解决你的问题

解决方案 »

  1.   

    你的意思是分两个ejb module 分别建实体bean和会话bean么?能不能把你的方案说的详细一点,我是第一次做这样的项目,好多东西不了解
      

  2.   

    我不是高手。
    到底是用一个还是两个ejb module,我认为这要看你的项目的规模了。规模不大,完全可以放在一个ejb module里啊。你若强行分开,想实现低的耦合和高的内聚,那么就要分析模块之间的到底有哪些逻辑关系。采用哪一种方案都有它好处和不足,这就具体看你偏重哪方面的需要了,例如需要在效率和易维护性上做一个trade-off等。
      

  3.   

    谢谢楼上的,因为之前没做过什么项目也不知道我们这个的规模属于哪个级别,只是数据库中的基本表大概有十五六个吧,能称得上中等吧!我想问一下如果用两个ejb module 分别写实体bean和会话bean,那么在会话bean中怎样调用实体bean呢?是不是像在客户端一样通过jndi检索呢?是否需要通过PortableRemoteObject.narrow()方法呢?  如果在一个ejb module 是否需要这样做呢?
      

  4.   

    需要通过jndi来找entity bean,除外我不知道有什么其他的方法。如果在同一个ejb module里,用会话bean来包装实体bean,在找实体bean时同样需要jndi啊。
      

  5.   

    多个实体Bean是否在同一个moudle下面视具体情况决定,如果想粗粒度实现,可以在同一个moudle中,如果想细粒度实现,可以分开。但是有一点要注意,之间有关联的各个实体Bean必须在同一个moudle之中,另外,建议你最好把会话Bean和实体Bean分开,这样便于维护虽然不再同一个moudle之中,不过你的会话Bean依然可以通过本地借口来访问实体Bean,这并不影响效率
      

  6.   

    谢谢各位知道!不过我还有个问题,会话bean通过本地借口具体怎么调用实体bean,是不是把实体bean所在的包import 进来呀?
      

  7.   

    不过我还有个问题,会话bean通过本地借口具体怎么调用实体bean,是不是把实体bean所在的包import 进来呀
    ----------------
    tmd翻翻书会死啊。书上写的清清楚楚,懒的可以了。就会叫叫叫,叫能成为高手哇,那我早成神了。s-h-i-t
      

  8.   

    楼上的妈的有道理,你以为我没翻过书么!我们为毕业设计做这个项目java的书真可谓买的应有尽有,java语言的有thing in java 、java 软件开发、java 2 编程21天自学通、java 2简明教程
    J2EE的有J2EE 1.4基础教程,JSP 高级开发与应用,J2EE 应用与BEA WEBLOGIC SERVER,用J2EE和UML开发JAVA企业级应用程序,开发工具有JBUILDER 精髓,还有数据库方面的书。但这些上都没有我问的这些问题,所以才来者求助你们这些高手!你可能会说再去买这方面的书,但我们已经买了那么多了,这些对于我们这些还没有毕业的学生已是不小的一个开销,实在没多余的再投资了,在网上也找了一些电子教材,但很不幸也都没有关于我问的问题,所以我就又想起了CSDN,在我眼里论坛里的高手们都是一些热心帮助我们这些菜鸟的好人至少也能给我推荐一些资料不至于我再花冤枉钱,你说我乱叫可以,但说我懒我却绝对不同意!上面我说的书虽说没看完但也看了大部分了,J2EE我是三月份开始学的,J2EE体系结构,J2EE的各种技术JSP SERVLET EJB JDBC 等这些都是从头学的,我也没有什么人指导,纯粹是自学,这中间也走了不少弯路,如今快毕业了我们又赶着做这个设计,没时间在一点点摸索了所以我想请一些高手指点一下,少走点弯路,尽快把毕业设计做好!
    如果你是高手嫌我只会叫不自己动手,自己保留意见就行了,何必说出来伤了大家的和气,坏了论坛的风气,如果你不是高手那就更没有理由指责我了!做好你自己的事就行!!!
    所以我这个帖子诸位能帮就帮一下,小弟自当感激,自会重分相送,不够另开贴放分!
    不想帮也没事,随便顶顶也可以不过不要在这乱骂,不欢迎!
      

  9.   

    如果你是高手嫌我只会叫不自己动手,自己保留意见就行了,何必说出来伤了大家的和气,坏了论坛的风气,如果你不是高手那就更没有理由指责我了!做好你自己的事就行!!!
    所以我这个帖子诸位能帮就帮一下,小弟自当感激,自会重分相送,不够另开贴放分!
    不想帮也没事,随便顶顶也可以不过不要在这乱骂,不欢迎!
    ------------------------------------------
    小伙子,有前途。推荐,精通EJB(第二版),www.cnforyou.com上有卖,原价59,优惠价50,送书上门。如果不想买的化可以到书店去看,多数书店开架卖,代个笔记本(不是笔记本电脑哦)去抄几个例子也行。网上也有电子版的,我见过,因为我有书了,所以就没留意。你可以自己搜搜。另,你那个学校的,如果是北京科技的,我到可以考虑借给你看看。
      

  10.   

    CSDN确实是个垃圾论坛,看看各个帖子的标题都知道了,90%在问别人回答了几百遍的问题。你去搜搜精华贴,我想应该有与你类似问题的讨论。如果没有,又印证了csdn是垃圾论坛的观点。哈哈。
      

  11.   

    数据库中有多个表,是建一个ejb module,然后每个表建一个实体bean,所有的session bean也放在这个module里,即所有的业务逻辑都在这一个ejb module里面,开发完成后只生成一个jar文件好呢还是对每个功能建一个ejb module只对要用上的表建实体BEAN, 实现相应功能的session bean 也放在这个module 里,这样每个功能打包成一个jar文件,但这有个疑问如果两个功能要用上同一个表,那么两个模块都要针对这个表建实体bean,这不是重复定义了么,并且每个ejb module 都要与数据库相连,这样效率是否低了
    --------------------------------------
    EJB是什么:EJB是一种提供分布是计算的规范,应用程序不管ejb的物理位置,应用程序都可以通过jndi查找,rmi技术调用来进行计算。EJB2.0提供的本地接口(local),是为了解决远程接口(remote)的性能问题,使得在同一个虚拟机上运行的ejb可以不用远程调用,大大提高性能。但对程序员开发来说区别并不大。仅仅在于:使用了EJBLocalHome和EJBLocalObject。EntityBean的使用:实体bean的性能有些问题,你不能完全依靠实体bean实现数据库持久层。至少在进行查询时使用jdbc要灵活和容易的多,性能上也会好很多。可以用实体bean实现增删该的功能,和进行没有关联的简单的查询。建议使用dao模式隔离应用程序和数据库,这样即使改动数据库或数据库访问方式也可以不影响应用程序。不要在servlet和jsp中调用dao,使用session调用dao。实体bean的话,能不用就不用,尽可能使用jdbc(开发调试都简单,性能也不错),可以留几个实体bean装装样子。不是实体bean不好,学习成本使用成本维护成本高而已。
    另外:搞清楚你的毕业设计是技术上的实践还是真正的用户项目,前者的话你想怎么搞都没关系,后者的话达到目的(满足项目需求)才是重要的。
      

  12.   

    呵呵,多谢兄台了,不过我在重庆上学:(昨晚看了一个文档讲的也是在一个module里的会话bean调实体bean,不过他是用通过jndi名字检索
    只不过是在lookup方法的ejb jndi名字前加上前缀java:comp/env/。通过jndi查找bean本身就花费巨大,我不知道这样对性能会有多大提升?我想应该还有其他方法吧!听君一席话,我也不在这“乱叫“了,自己动手丰衣足食!不过有热心人想帮一下的话,小弟欢迎,感激不尽!
      

  13.   

    采用serviceLocator模式将链接缓存起来,代码如下:package com.rm.common;import java.sql.*;
    import javax.sql.DataSource;
    import java.util.Hashtable;
    import javax.naming.*;
    import javax.ejb.*;
    import javax.rmi.PortableRemoteObject;import javax.jms.JMSException;
    import javax.jms.QueueConnection;
    import javax.jms.QueueConnectionFactory;import com.rm.exception.*;
    import com.rm.ejb.dao.*;
    import com.rm.ejb.counter.*;public class ServiceLocator {
      private static ServiceLocator serviceLocatorRef = null;
      private static Hashtable ejbHomeCache           = null;
      private static Hashtable dataSourceCache        = null;
      private static Hashtable queueConnectionFactoryCache   = null;
      public static final int COUNTER = 0;
      public static final int TITLEDAO = 1;
      public static final int EDITORDAO = 2;  private static final String COUNTER_JNDINAME = "counter/Counter";
      private static final String TITLEDAO_JNDINAME = "title/TitleDAO";
      private static final String EDITORDAO_JNDINAME = "editor/EditorDAO";
      private static final String SUBSCRIPTIONDB_JNDINAME = "java:/subscriptionDS";  private static final Class COUNTERCLASSREF = CounterHome.class;
      private static final Class TITLECLASSREF = TitleDAOHome.class;
      private static final Class EDITORCLASSREF = EditorDAOHome.class;  static {
        serviceLocatorRef = new ServiceLocator();
      }
      private ServiceLocator(){}
      public static ServiceLocator getInstance(){
      return serviceLocatorRef;
      }
      static private String getServiceName(int pServiceId) throws
          ServiceLocatorException {
        String serviceName = null;
        switch (pServiceId) {
          case COUNTER:
            serviceName = COUNTER_JNDINAME;
            break;
          case TITLEDAO:
            serviceName = TITLEDAO_JNDINAME;
            break;
          case EDITORDAO:
            serviceName = EDITORDAO_JNDINAME;
            break;
          default:
            throw new ServiceLocatorException(
                "Unable to locate the service request"
                + " in ServiceLocator.getServiceName() method. ");
          }
          return serviceName;
      }
      static private Class getEJBHomeRef(int pServiceId) throws ServiceLocatorException{
          Class homeRef = null;
          switch (pServiceId) {
            case COUNTER:
              homeRef = COUNTERCLASSREF;
              break;
            case TITLEDAO:
              homeRef = TITLECLASSREF;
              break;
            case EDITORDAO:
              homeRef = EDITORCLASSREF;
              break;
            default:
              throw new ServiceLocatorException(
                          "Unable to locate the service request"
                          + " in ServiceLocator.getEJBHomeRef() method. ");
          }
          return homeRef;
      }
      public EJBHome getEJBHome(int pServiceId) throws ServiceLocatorException{
            String serviceName = getServiceName(pServiceId);
            EJBHome ejbHome = null;
          try {
            if (ejbHomeCache.containsKey(serviceName)){
              ejbHome = (EJBHome)ejbHomeCache.get(serviceName);
              return ejbHome;
            }else {
              Context ctx = new InitialContext();
              Object jndiRef = ctx.lookup(serviceName);
              Object portableObj = PortableRemoteObject.narrow(jndiRef,getEJBHomeRef(pServiceId));
              ejbHome = (EJBHome)portableObj;
              ejbHomeCache.put(serviceName,ejbHome);
              return ejbHome;
            }
          }
          catch (NamingException e) {
            throw new ServiceLocatorException(
                          "NamingException in ServiceLocator.getEJBHome() method. ");
          }
          catch (Exception e) {
            throw new ServiceLocatorException(
                          "General exception in ServiceLocator.getEJBHome() method. ");
          }
      }
      public java.sql.Connection getDBConn(int pServiceId) throws ServiceLocatorException{    String serviceName = getServiceName(pServiceId);
        java.sql.Connection conn = null;
        try {
          if (dataSourceCache.containsKey(serviceName)) {
            DataSource ds = (DataSource) dataSourceCache.get(serviceName);
            conn = ((DataSource) ds).getConnection();
            return conn;
          }
          else {
            Context ctx = new InitialContext();
            DataSource newDataSource = (DataSource) ctx.lookup(serviceName);
            dataSourceCache.put(serviceName, newDataSource);
            return newDataSource.getConnection();
          }
        }catch (SQLException e) {
          throw new ServiceLocatorException(
              "A SQLErro has occured in ServiceLocator.getDBConn() method. ");
        }
        catch (NamingException e) {
          throw new ServiceLocatorException(
              "A JNDI Naming has occured in ServiceLocator.getEJBHome() method. ");
        }
        catch (Exception e) {
          throw new ServiceLocatorException(
              "General exception in ServiceLocator.getEJBHome() method. ");
        }
      }
      public QueueConnection getJMSQueueconn(int pServiceId) throws ServiceLocatorException{
       String serviceName = getServiceName(pServiceId);
       QueueConnection qc = null;
      
       try {
       if (queueConnectionFactoryCache.containsKey(serviceName)){
       QueueConnectionFactory qcf = (QueueConnectionFactory)
       queueConnectionFactoryCache.get(serviceName);
       qc = qcf.createQueueConnection();
       }else {
       Context ctx = new InitialContext();
       QueueConnectionFactory qcf = (QueueConnectionFactory)
       ctx.lookup(serviceName);
       queueConnectionFactoryCache.put(serviceName,qcf);
       qc = qcf.createQueueConnection();
       }
       }catch (JMSException e){
       throw new ServiceLocatorException(
       "A JMS exception has occurred in ServiceLocator.getJMSQueueConn()"+e);
       }catch(NamingException e){
       throw new ServiceLocatorException("A JNDI Naming exception occurred in "+
    "ServiceLocator.getJMSQueueConnection()");  
       }catch (Exception e){
       throw new ServiceLocatorException();
       }  
       return qc;
      
      }
    }
    --------------
    以上代码只是提供思路。参考实用j2ee设计模式编程指南 电子工业出版社 wrox出版。或相关j2ee设计模式的书籍。
      

  14.   

    好深奥啊,看来java确实是博大精深呀,没有几年工夫是精通不了的,不过我会努力的!看来兄台确实是个高手了,被你批评几句确实认识到自己的缺点了,什么事情都不能寄托于别人,相信自己,靠自己才是正理!