<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    斷點(diǎn)

    每天進(jìn)步一點(diǎn)點(diǎn)!
    posts - 174, comments - 56, trackbacks - 0, articles - 21

    在做項(xiàng)目中碰見(jiàn)這樣的問(wèn)題,如下:
    Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.pcis.cus.vo.CusClientVO#002255207];

    原因: 有一個(gè)具有相同值的不同對(duì)象已經(jīng)與和 session 相關(guān)聯(lián)

    解決(程序的一部分):
     //CusClientVO cusVo = new CusClientVO();
            CusClientVO cusVo = null;
            IUserDetails user = CurrentUser.getUser();
            try {
                if ("Same".equals(cusFlag)) {//被保險(xiǎn)人和投保人是同一人
                    cusVo = (CusClientVO)this.getById(CusClientVO.class, applicant.getCAppCde());
                    if(cusVo==null){  //表示新增客戶。
                        cusVo = new CusClientVO();
                    }
                    this.saveCusApplicant(applicant, cusVo);
                    if(!applicantflag ){
                        cusVo.setTCrtTm(new Date());
                        cusVo.setCCrtCde(user.getOpRelCde());
                    }
                }
                cusVo.setTUpdTm(new Date());
                cusVo.setCUpdCde(user.getOpRelCde());
                //
                this.saveOrUpdate(cusVo);
            } catch (DaoException ex) {
                BusinessServiceException e = new BusinessServiceException(ex);
                e.setErrorMsg("保存客戶信息失敗");
            }

    相關(guān)連接:

    http://hi.baidu.com/anypcao/blog/item/0db1a41cd3478d8187d6b6d2.html

    http://agreal.javaeye.com/blog/339560


    posted @ 2009-10-31 13:11 斷點(diǎn) 閱讀(61) | 評(píng)論 (0) 

    posted @ 2010-01-13 23:33 斷點(diǎn) 閱讀(1364) | 評(píng)論 (0)編輯 收藏

    有兩張表(question、answer),它們存在著一對(duì)多關(guān)系(question->answer)和多對(duì)一關(guān)系(answer->question)。

    在Answer.java中定義有:
    public class Answer {
        private String userid;
        private Question question;
        private int qid;
    }

    在answer.hbm.xml中有:
     <many-to-one name="question" class="org.lxh.myzngt.vo.Question" fetch="select">
                <column name="qid" />
     </many-to-one>

    所以SQL語(yǔ)句如下:

    public List queryByUserAnswer(String userid, int currentPage, int lineSize) {
            List all = null;
            String hql = "from Question as q where q.qid in(select a.question.qid from Answer as a where a.userid=?)";
            Query q = super.getSession().createQuery(hql);
            q.setString(0, userid);
            // 分頁(yè)操作。
            q.setFirstResult((currentPage - 1) * lineSize);
            q.setMaxResults(lineSize);
            all = q.list();
            return all;
        }

    否則報(bào)錯(cuò):

    org.hibernate.QueryException: could not resolve property: qid of: org.lxh.myzngt.vo.Answer [select count(q.qid) from org.lxh.myzngt.vo.Question as q where q.qid in(select a.qid from org.lxh.myzngt.vo.
    Answer as a where a.userid=?)]

    posted @ 2009-02-23 15:58 斷點(diǎn) 閱讀(173) | 評(píng)論 (0)

    posted @ 2010-01-13 23:26 斷點(diǎn) 閱讀(404) | 評(píng)論 (0)編輯 收藏

    org.hibernate.hql.ast.QuerySyntaxError: user is not mapped. [from user as u where u.userid=?]

    出現(xiàn)這個(gè)問(wèn)題,主要是hibernate語(yǔ)句不對(duì)。

    User.hbm.xml為:

    <hibernate-mapping>
    <class name="org.lxh.myzngt.vo.User" table="user" >
            <id name="id" type="java.lang.Integer">
                <column name="id" />
                <generator class="native"></generator>
            </id>
    </class>
    </hibernate-mapping>

    因此,hql 語(yǔ)句如下:

    String hql = "from User as u where u.userid=?"


    posted @ 2009-02-11 17:55 斷點(diǎn) 閱讀(109) | 評(píng)論 (0)

    posted @ 2010-01-13 23:22 斷點(diǎn) 閱讀(259) | 評(píng)論 (0)編輯 收藏

    一個(gè)Web 應(yīng)用發(fā)布到Jboss 服務(wù)器時(shí)需要打成war包。
    下面介紹jar命令行Ant任務(wù)兩種war文件的打包方式。

    1.命令行下進(jìn)行war 文件打包。
    在Dos 窗口中進(jìn)入到WEB 應(yīng)用根目錄下(WebRoot下),執(zhí)行如下命令,如:
    jar cvf EJBClient.war *,再把打包的EJBClient.war拷貝到C:\jboss-5.0.0.GA\server\default\deploy發(fā)布。

    2.在Ant 任務(wù)中進(jìn)行war文件打包。
    build.xml文件如下:
     <?xml version="1.0" encoding="UTF-8"?>
    <project name="EJBClient" default="war" basedir=".">
     <property environment="env" />
     <property name="jboss.home" value="${env.JBOSS_HOME}" />
     <property name="jboss.server.config" value="default" />
     <target name="war" description="創(chuàng)建WEB 發(fā)布包">
      <war warfile="${basedir}/${ant.project.name}.war" webxml="${basedir}/WebRoot/WEB-INF/web.xml">
       <classes dir="${basedir}/WebRoot/WEB-INF/classes">
        <include name="**/*.class" />
       </classes>
       
       <lib dir="${basedir}/WebRoot/WEB-INF/lib">
        <include name="*.jar" />
       </lib>
       
       <webinf dir="${basedir}/WebRoot">
        <include name="*.*" />
       </webinf>
      </war>
     </target>
     
     <target name="deploy" depends="war" description="發(fā)布WAR">
      <copy file="${basedir}\${ant.project.name}.war" todir="${jboss.home}\server\${jboss.server.config}\deploy"/>
     </target>
     
     <target name="undeploy"  description="卸載WAR">
      <delete file="${jboss.home}\server\${jboss.server.config}\deploy\${ant.project.name}.war"/>
     </target>
    </project>


    posted @ 2009-03-30 18:15 斷點(diǎn) 閱讀(145) | 評(píng)論 (0)

    posted @ 2010-01-13 23:11 斷點(diǎn) 閱讀(343) | 評(píng)論 (0)編輯 收藏

    do not get WebServiceContext property from stateless bean context, it should already have been injected

    這個(gè)主要原因就在stateless bean的實(shí)現(xiàn)類。

    仔細(xì)查看后發(fā)現(xiàn),原來(lái)我在實(shí)現(xiàn)類的每個(gè)方法前加入了 @WebMethod(指定暴露給外界的方法),因此去掉就可以了。


    13:41:39,168 WARN  [StatelessBeanContext] EJBTHREE-1337: do not get WebServiceContext property from stateless bean context, it should already have been injected
    13:41:39,215 WARN  [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container
    13:41:39,215 WARN  [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container
    13:41:39,230 WARN  [InterceptorRegistry] applicable interceptors is non-existent for public cn.ztf.bean.Order cn.ztf.service.impl.OrderServiceBean.getOrder(java.lang.String)
    13:41:39,246 WARN  [InterceptorRegistry] applicable interceptors is non-existent for public java.lang.String
    cn.ztf.service.impl.OrderServiceBean.getUserName(java.lang.String)
    13:41:39,246 WARN  [InterceptorRegistry] applicable interceptors is non-existent for public java.util.List
    cn.ztf.service.impl.OrderServiceBean.getOrders()
    13:41:39,246 WARN  [InterceptorRegistry] applicable interceptors is non-existent for public cn.ztf.bean.Order cn.ztf.service.impl.OrderServiceBean.getOrder(java.lang.String)
    13:41:39,261 WARN  [InterceptorRegistry] applicable interceptors is non-existent for public java.lang.String
    cn.ztf.service.impl.OrderServiceBean.getUserName(java.lang.String)
    13:41:39,261 WARN  [InterceptorRegistry] applicable interceptors is non-existent for public java.util.List
    cn.ztf.service.impl.OrderServiceBean.getOrders()
    13:41:39,293 WARN  [StatelessBeanContext] EJBTHREE-1337: do not get WebServiceContext property from stateless bean context, it should already have been injected
    13:46:27,043 WARN  [StatelessBeanContext] EJBTHREE-1337: do not get WebServiceContext property from stateless bean context, it should already have been injected
    13:46:27,043 WARN  [StatelessBeanContext] EJBTHREE-1337: do not get WebServiceContext property from stateless bean context, it should already have been injected

     
    posted @ 2009-03-30 14:33 斷點(diǎn) 閱讀(647) | 評(píng)論 (0)

    posted @ 2010-01-13 22:50 斷點(diǎn) 閱讀(1067) | 評(píng)論 (1)編輯 收藏

    Web服務(wù)也是一種分布式技術(shù),屬于行業(yè)規(guī)范,可以跨平臺(tái)及語(yǔ)言。
    EJB屬于java平臺(tái)規(guī)范,盡管理論上可以跨平臺(tái),但實(shí)現(xiàn)起來(lái)比較麻煩,所以其應(yīng)用范圍局限在java平臺(tái)。

    二者偏重點(diǎn)不同:
    Web服務(wù)偏重的是這個(gè)系統(tǒng)對(duì)外提供什么功能;
    EJB偏重的是如何使用一個(gè)個(gè)組件組裝這些功能。

    例如:一個(gè)硬盤(pán),它對(duì)外提供的是存儲(chǔ)服務(wù),這是web服務(wù)的關(guān)注點(diǎn);對(duì)于怎樣組裝這個(gè)硬盤(pán),web服務(wù)并不關(guān)心,而這些是EJB所關(guān)注的。

    JavaEE為web service提供了兩種不同的編程模型:EJB容器模型、Web容器模型
    下面以最新的JAX-WS2.x規(guī)范(Java API for XML-based Web Services)介紹Webservice的開(kāi)發(fā)。
    注:JAX-WS的下載路徑為https://jax-ws.dev.java.net/servlets/ProjectDocumentList?folderID=7796&expandFolder=7796&folderID=11088

    EJB容器模型的WEB服務(wù)的客戶端開(kāi)發(fā):
    注:首先我們需要建立一個(gè)無(wú)狀態(tài)SessionBean,然后把此無(wú)狀態(tài)SessionBean發(fā)布為web service。

    1.在應(yīng)用的類路徑下放入JAX-WS的全部jar文件,并且把引進(jìn)的jar文件添加到類路徑上,即右擊項(xiàng)目名-->Properties-->Java Build Path-->Add JARS。
    如果你使用的是JDK6,這一步可以省略,因?yàn)镴DK6已經(jīng)綁定了JAX-WS。目前JDK6綁定的JAX-WS版本是2.0。

    2.把JAX-WS產(chǎn)品lib目錄中找到j(luò)axws-api.jar和jaxb-api.jar,把這兩個(gè)文件copy到JDK_HOME/jre/lib/endorsed目錄下。

    3.利用Web Service客戶端生成工具(wsimport工具的Ant任務(wù)類)生成輔助類。
    build.xml文件內(nèi)容如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <project name="WSClient" default="wsclientgen" basedir=".">
     <property name="src.dir" value="${basedir}/src" />
     
     <path id="build.classpath" description="設(shè)置類路徑">
      <fileset dir="${basedir}/lib">
       <include name="*.jar"></include>
      </fileset>
     </path>
     
     <target name="wsclientgen" description="生成webservice客戶端輔助代碼,執(zhí)行后請(qǐng)刷新項(xiàng)目">
      <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport"
       classpathref="build.classpath"/>
      <wsimport wsdl="http://localhost:8090/WebService/OrderServiceBean?wsdl"
       sourcedestdir="${src.dir}"  package="cn.ztf.ws.client" keep="true"
        verbose="true" destdir="${basedir}/bin"/>
     </target>
    </project>

    4.借助輔助類調(diào)用Web Service。


    posted @ 2009-03-30 14:22 斷點(diǎn) 閱讀(169) | 評(píng)論 (0)

    posted @ 2010-01-13 22:48 斷點(diǎn) 閱讀(409) | 評(píng)論 (0)編輯 收藏

    EJB3.0中MessageDrivenBean:

    1.java消息驅(qū)動(dòng)bean屬于Java消息服務(wù)(Java Message Service,簡(jiǎn)稱JMS)。

    2.JMS是用于訪問(wèn)企業(yè)消息系統(tǒng)的開(kāi)發(fā)商中心的API。企業(yè)消息系統(tǒng)可以協(xié)助應(yīng)用軟件通過(guò)網(wǎng)絡(luò)進(jìn)行消息交互。

    3.JMS的編程過(guò)程簡(jiǎn)單概括為:應(yīng)用程序A-->(消息)-->Jboss JMS-->(消息)-->應(yīng)用程序B。應(yīng)用程序A和應(yīng)用程序B沒(méi)有直接的代碼關(guān)聯(lián),兩者實(shí)現(xiàn)了解耦。消息傳遞系統(tǒng)的中心就是消息。

    消息驅(qū)動(dòng)Bean(MDB)是設(shè)計(jì)用來(lái)專門處理基于消息請(qǐng)求的組件,它和無(wú)狀態(tài)Session Bean一樣也使用了實(shí)例池技術(shù),容器可以使用一定數(shù)量的bean實(shí)例并發(fā)處理成百上千個(gè)JMS消息。正因?yàn)镸DB具有處理大量并發(fā)消息的能力,所以非常適合應(yīng)用在一些消息網(wǎng)關(guān)產(chǎn)品。如果一個(gè)業(yè)務(wù)執(zhí)行的時(shí)間很長(zhǎng),而執(zhí)行結(jié)果無(wú)需實(shí)時(shí)向用戶反饋時(shí),也很適合使用MDB。如訂單成功后給用戶發(fā)送一封電子郵件或發(fā)送一條短信等。

    消息有下面幾種類型,他們都是派生自Message接口。
    StreamMessage:一種主體中包含Java基本值流的消息。其填充和讀取均按順序進(jìn)行。
    MapMessage:一種主體中包含一組名-值對(duì)的消息。(沒(méi)有定義條目順序)
    TextMessage:一種主體中包含Java字符串的消息(例如:XML消息)
    ObjectMessage:一種主體中包含序列化Java對(duì)象的消息。
    BytesMessage:一種主體中包含連續(xù)字節(jié)流的消息。

    消息的傳遞模型:
    JMS支持兩種消息傳遞模型:點(diǎn)對(duì)點(diǎn)(point-to-point,簡(jiǎn)稱PTP)和發(fā)布/訂閱(publish/subscribe,
    簡(jiǎn)稱pub/sub)。
    二者有以下區(qū)別:
    1.PTP 消息傳遞模型規(guī)定了一條消息只能傳遞給一個(gè)接收方。采用javax.jms.Queue表示。
    2.Pub/sub 消息傳遞模型允許一條消息傳遞給多個(gè)接收方。采用javax.jms.Topic表示。

    注意:每種模型都通過(guò)擴(kuò)展公用基類來(lái)實(shí)現(xiàn)。例如,javax.jms.Queue 和javax.jms.Topic都擴(kuò)展自
    javax.jms.Destination 類。

     

    開(kāi)發(fā)步驟如下:
    一、配置destinations-service.xml文件。
    JBOSS使用一個(gè)XML文件配置隊(duì)列地址,文件的取名格式應(yīng)遵循*-service.xml,我取名為
    destinations-service.xml。
    jboss默認(rèn)的全局JNDI名稱組成為:"queue"+"/"+"目標(biāo)地址"。
    開(kāi)始JMS編程前,我們需要先配置消息到達(dá)的目標(biāo)地址(Destination),因?yàn)橹挥心繕?biāo)地址存在了,
    我們才能發(fā)送消息到這個(gè)地址。由于每個(gè)應(yīng)用服務(wù)器關(guān)于目標(biāo)地址的配置方式都有所不同,下面以jboss為例,配置一個(gè)queue類型的目標(biāo)地址。
    <?xml version="1.0" encoding="UTF-8"?>
    <server>
       <mbean code="org.jboss.mq.server.jmx.Queue" 

    name="jboss.mq.destination:service=Queue,name=ztfQueue">
          <attribute name="JNDIName">queue/ztfQueue</attribute>
          <depends optional-attribute-

    name="DestinationManager">jboss.mq:service=DestinationManager</depends>
        </mbean>
       <mbean code="org.jboss.mq.server.jmx.Topic" 

    name="jboss.mq.destination:service=Topic,name=ztfTopic">
          <attribute name="JNDIName">topic/ztfTopic</attribute>
          <depends optional-attribute-

    name="DestinationManager">jboss.mq:service=DestinationManager</depends>
        </mbean>
    </server>
    注意:任何隊(duì)列或主題被部署之前,應(yīng)用服務(wù)器必須先部署Destination Manager Mbean,所有我們
    通過(guò)<depends>節(jié)點(diǎn)聲明這一依賴。

    二、在java類中發(fā)送消息(用到j(luò)ndi.properties)。
    一般發(fā)送消息有以下步驟:
    1.得到一個(gè)JNDI初始化上下文(Context)
    InitialContext ctx = new InitialContext();

    2.根據(jù)上下文查找一個(gè)連接工廠ConnectionFactory,改連接工廠是由JMS提供的,不需我們自己創(chuàng)建,每個(gè)廠商都為它綁定了一個(gè)全局JNDI,我們通過(guò)它的全局JNDI便獲取它;
    QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup("ConnectionFactory");

    3.從連接工廠得到一個(gè)連接QueueConnection。
    QueueConnection conn = factory.createQueueConnection();

    4.通過(guò)連接來(lái)建立一個(gè)會(huì)話(Session);
    QueueSession session = conn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
    這句代碼意思是:建立不需要事務(wù)的并且能自動(dòng)確立消息已接收的會(huì)話。

    5.查找目標(biāo)地址:
    Destination destination=(Destination)ctx.lookup("queue/ztfQueue");

    6.根據(jù)會(huì)話以及目標(biāo)地址來(lái)建立消息生產(chǎn)者M(jìn)essageProducer(QueueSender和TopicPublisher都擴(kuò)展自MessageProducer接口):
    MessageProducer producer = session.createProducer(destination);
    TextMessage msg = session.createTextMessage("您好:荊州,這是我的第一個(gè)消息驅(qū)動(dòng)Bean");
    producer.send(msg);

    三、采用MessageDrivenBean接收消息。
    當(dāng)容器檢測(cè)到bean守候的目標(biāo)地址有消息到達(dá)時(shí),容器調(diào)用onMessage()方法,將消息作為參數(shù)傳入
    MDB。MDB在onMessage()中決定如何處理改消息。你可以使用注解指定MDB監(jiān)聽(tīng)哪一個(gè)目標(biāo)地址(Destination)。當(dāng)MDB部署時(shí),容器將讀取其中的配置信息。

    一個(gè)MDB通常要實(shí)現(xiàn)MessageListener接口,在接口定義了onMessage()方法。Bean通過(guò)它來(lái)處理收到的JMS消息。
    @MessageDriven(activationConfig=
    {
     @ActivationConfigProperty

    (propertyName="destinationType",propertyValue="javax.jms.Queue"),
     @ActivationConfigProperty

    (propertyName="destination",propertyValue="queue/ztfQueue"),
     @ActivationConfigProperty(propertyName="acknowledgeMode",propertyValue="Auto-

    acknowledge")
    })
    public class MessageDrivenBean implements MessageListener{
     public void onMessage(Message message) {
      TextMessage msg = (TextMessage)message;
      try {
       System.out.println(msg.getText());
      } catch (JMSException e) {
       e.printStackTrace();
      }
     }
    }

    四、把工程src下的文件打成jar包(用到build.xml),在C:\jboss-5.0.0.GA\server\default\deploy進(jìn)行部署。

    五、運(yùn)行發(fā)送消息的java類,此時(shí)在console中就可看見(jiàn)結(jié)果了。

    六、至此,一個(gè)MessageDrivenBean開(kāi)發(fā)就成功了。


    posted @ 2009-03-27 17:43 斷點(diǎn) 閱讀(158) | 評(píng)論 (0) 

    posted @ 2010-01-13 22:47 斷點(diǎn) 閱讀(367) | 評(píng)論 (0)編輯 收藏

    實(shí)體bean:
    1.它屬于java持久化規(guī)范(簡(jiǎn)稱JPA)里的技術(shù),Entitybean通過(guò)元數(shù)據(jù)在javabean和數(shù)據(jù)庫(kù)表之間建立起映射關(guān)系,然后Java程序員就可以使用
    面向?qū)ο蟮木幊趟枷雭?lái)操縱數(shù)據(jù)庫(kù)。

    2.通過(guò)注解使實(shí)體bean與數(shù)據(jù)庫(kù)表相映射。

    3.當(dāng)客戶端遠(yuǎn)程調(diào)用EJB時(shí),數(shù)據(jù)在傳送工程中是需要序列化的 ,業(yè)務(wù)方法是要返回Entitybean對(duì)象到客戶端,顯然Entitybean對(duì)象是要進(jìn)行序列化的過(guò)程,所以要實(shí)現(xiàn)序列化接口,即對(duì)象在交互時(shí)需要實(shí)現(xiàn)序列化。

    4.Entitybean主鍵值的生成方式。
    @GeneratedValue(strategy = GenerationType.IDENTITY)針對(duì)Mysql,
    @GeneratedValue(strategy = GenerationType.SEQUENCE)針對(duì)Oracle,
    @GeneratedValue(strategy = GenerationType.AUTO)自動(dòng)匹配數(shù)據(jù)庫(kù)。

    5.需要保留一個(gè)無(wú)參的構(gòu)造函數(shù),是JPA規(guī)范要求的,如果沒(méi)有,在運(yùn)行時(shí)是要報(bào)錯(cuò)的。

    6.對(duì)象之間的比較,通常采用對(duì)象標(biāo)志屬性來(lái)進(jìn)行比較,也就是ID進(jìn)行比較,因此現(xiàn)在重載hashCode、equals兩個(gè)方法。

     

    JPA的出現(xiàn)主要是為了簡(jiǎn)化現(xiàn)有的持久化開(kāi)發(fā)工作和整合ORM技術(shù),目前實(shí)現(xiàn)的JPA規(guī)范的主流產(chǎn)品有Hibernate、Toplink和OpenJPA,在jboss中采用了Hibernate作為其持久化實(shí)現(xiàn)產(chǎn)品。

     

    根據(jù)JPA規(guī)范的要求:在實(shí)體bean應(yīng)用中,我們需要在應(yīng)用的類路徑下的META-INF目錄加入持久化配置文件persistence.xml。
    persistence.xml文件用于指定Entitybean使用的數(shù)據(jù)源及EntityManager對(duì)象的默認(rèn)行為。
    persistence.xml的配置說(shuō)明如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
     http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
     
     <!--  一個(gè)持久化單元是一個(gè)Entitybean的集合,JTA代表全局事物。-->
     <persistence-unit name="ztf" transaction-type="JTA">
      <jta-data-source>java:/ztfDS</jta-data-source>
      <properties>
       <!-- 根據(jù)元數(shù)據(jù)生成數(shù)據(jù)庫(kù)的表結(jié)構(gòu)。 -->
       <property name="hibernate.hbm2ddl.auto" value="update"/>
       <!-- 顯示執(zhí)行的SQL。 -->
       <property name="hibernate.show_sql" value="true"/>
       <!-- 格式化顯示的SQL 。 -->
       <property name="hibernate.format_sql" value="true"/>
       <!-- SQL方言。 -->
       <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9Dialect"/>
      </properties>
     </persistence-unit>
    </persistence>

    注意:因?yàn)閖boss 采用Hibernate,Hibernate 有一項(xiàng)屬性hibernate.hbm2ddl.auto,該屬性指定實(shí)體Bean發(fā)布時(shí)是否同步數(shù)據(jù)庫(kù)結(jié)構(gòu)。

    1.如果hibernate.hbm2ddl.auto的值設(shè)為create-drop,在實(shí)體Bean發(fā)布及卸載時(shí)將自動(dòng)創(chuàng)建及刪除相應(yīng)數(shù)據(jù)庫(kù)表(注意:Jboss 服務(wù)器啟動(dòng)或關(guān)閉時(shí)也會(huì)引發(fā)實(shí)體Bean 的發(fā)布及卸載)。

    2.如果hibernate.hbm2ddl.auto的值設(shè)為update,以后為了實(shí)體bean的改動(dòng)能反應(yīng)到數(shù)據(jù)表,建議使用update,這樣實(shí)體Bean 添加一個(gè)屬性時(shí)能同時(shí)在數(shù)據(jù)表增加相應(yīng)字段。


    posted @ 2009-03-26 12:35 斷點(diǎn) 閱讀(166) | 評(píng)論 (0)

    posted @ 2010-01-13 22:45 斷點(diǎn) 閱讀(392) | 評(píng)論 (0)編輯 收藏

    遠(yuǎn)程接口調(diào)用ejb的過(guò)程:
    首先客戶端需要與ejb建立起socket通信,在通信管道上他們之間需要來(lái)回發(fā)送IIOP協(xié)議消息,因?yàn)閿?shù)據(jù)要在網(wǎng)絡(luò)進(jìn)行傳輸,存放數(shù)據(jù)的java對(duì)象必須要進(jìn)行序列化。這個(gè)過(guò)程中,有網(wǎng)絡(luò)通信的開(kāi)銷、協(xié)議解析的開(kāi)銷、對(duì)象序列化的開(kāi)銷。因?yàn)閑jb是分布式技術(shù),它允許客戶端與ejb應(yīng)用在不同一機(jī)器上面,所以這些開(kāi)銷也是必然的。

    本地接口調(diào)用ejb的過(guò)程:
    通過(guò)本地接口調(diào)用ejb,直接在內(nèi)存交互,這樣就可以避免因網(wǎng)絡(luò)通信所造成的各種性能開(kāi)銷。
    注意:
    1.只有客戶端與EJB應(yīng)用都在同一個(gè)JVM內(nèi)運(yùn)行的時(shí)候,我們才能調(diào)用本地接口,否則只能調(diào)用遠(yuǎn)程接口。
    2.只要客戶端與ejb發(fā)布在同一個(gè)jboss內(nèi),我們就認(rèn)為它們?cè)谕粋€(gè)JVM。
    3.客戶端可以調(diào)用本地接口;也可調(diào)用遠(yuǎn)程接口;當(dāng)本地接口與遠(yuǎn)程接口都有同一個(gè)方法時(shí),優(yōu)先調(diào)用本地接口中的方法。

    開(kāi)發(fā)一個(gè)自己的遠(yuǎn)程接口的無(wú)狀態(tài)會(huì)話bean:
    1.需要自己開(kāi)發(fā)的EJB的組件.jar包。
    注意:在實(shí)現(xiàn)類中加入注解,綁定接口。
    @Stateless、@Remote(HelloWorld.class) //為接口。
    2.需要自己開(kāi)發(fā)出的EJB的客戶端,并把客戶端工程打成.war文件。
    注意:客戶端所要知道的JNDI名稱,下面的HelloWorld 為遠(yuǎn)程接口。
    InitialContext ctx = new InitialContext();
    HelloWorld helloWorld = (HelloWorld)ctx.lookup("HelloWorldBean/remote");
    out.println(helloWorld.sayHello("荊州"));
    3.把.jar和.war文件拷貝到j(luò)boss的deploy區(qū)。
    4.打開(kāi)瀏覽器,輸入自己開(kāi)發(fā)出的EJB客戶端的.jsp頁(yè)面,即可。

    開(kāi)發(fā)一個(gè)自己的本地接口的無(wú)狀態(tài)會(huì)話bean:
    1.需要自己開(kāi)發(fā)的EJB的組件.jar包。
    注意:在實(shí)現(xiàn)類中加入注解,綁定接口。
    @Stateless、@Local(HelloWorldLocal.class)//接口。
    2.需要自己開(kāi)發(fā)出的EJB的客戶端,并把客戶端工程打成.war文件。
    注意:客戶端所要知道的JNDI名稱,下面的HelloWorldLocal 為本地接口。
    InitialContext ctx = new InitialContext();
    HelloWorldLocal helloWorld = (HelloWorldLocal)ctx.lookup("HelloWorldLocalBean/local");
    out.println(helloWorld.sayHello("荊州"));
    3.把.jar和.war文件拷貝到j(luò)boss的deploy區(qū)。
    4.打開(kāi)瀏覽器,輸入自己開(kāi)發(fā)出的EJB客戶端的.jsp頁(yè)面,即可。

    Bean實(shí)例的兩種管理技術(shù):
    1.無(wú)狀態(tài)bean使用實(shí)例池技術(shù)管理bean;
    2.有狀態(tài)bean使用激活(activation)管理bean。

    Jboss生成的JNDI名稱,默認(rèn)命名規(guī)則如下:
    如果把EJB應(yīng)用打包成后題為.jar的模塊文件,默認(rèn)的全局JNDI名稱是
    本地接口:EJB-CLASS-NAME/local
    遠(yuǎn)程接口:EJB-CLASS-NAME/remote
    例如:把EJB-HelloWorld(里面包含接口HelloWorld和實(shí)現(xiàn)類HelloWorldBean)應(yīng)用打包成EJB-HelloWorld.jar文件,它的遠(yuǎn)程接口的JNDI名稱是:HelloWorldBean/remote。

    jndi.properties的配置:
    java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
    java.naming.provider.url=localhost:1099


    posted @ 2009-03-26 09:56 斷點(diǎn) 閱讀(255) | 評(píng)論 (0)

    posted @ 2010-01-13 22:42 斷點(diǎn) 閱讀(355) | 評(píng)論 (0)編輯 收藏

    要發(fā)布EJB 時(shí)必須把她打成*.jar 文件,一個(gè)EJB 打包后的目錄結(jié)構(gòu)如下:
    EJB 應(yīng)用根目錄:
    | -- com (你的.class 文件)
    | -- META-INF
    | -- MANIFEST.MF (如果使用工具打包,該文件由工具自動(dòng)生成)
    打包的方式有很多,如:jar 命令行、集成開(kāi)發(fā)環(huán)境的打包向?qū)Ш虯nt 任務(wù)。

    下面介紹Elispse 打包向?qū)Ш虯nt 打包任務(wù)。
    1. Elispse 打包向?qū)?br /> 在Elispse 開(kāi)發(fā)環(huán)境下,可以通過(guò)向?qū)нM(jìn)行打包。右擊項(xiàng)目名稱,在跳出的菜單中選擇Export-->Java-->JAR file,在"選擇要導(dǎo)出的資源"時(shí),選擇源目錄和用到的資源然,后選擇一個(gè)存放目錄及文件名,點(diǎn)"完成"就結(jié)束了打包。

    2. Ant 打包任務(wù)
    主要是在Eclipse下,通過(guò)配置build.xml進(jìn)行ANT 打包,來(lái)提高開(kāi)發(fā)效率,也是推薦的打包方式。
    下面我們看一個(gè)簡(jiǎn)單的打包任務(wù)。
    <?xml version="1.0" encoding="UTF-8"?>
    <project name="EJB-HelloWorld" basedir=".">
    <property name="src.dir" value="${basedir}\src" />
    <property environment="env" />
    <property name="jboss.home" value="${env.JBOSS_HOME}" />
    <property name="jboss.server.config" value="default" />
    <property name="build.dir" value="${basedir}\build" />

    <path id="build.classpath">
    <fileset dir="${jboss.home}\client">
    <include name="*.jar"></include>
    </fileset>
    <pathelement location="${build.dir}"/>
    </path>

    <target name="prepare">
    <delete dir="${build.dir}"/>
    <mkdir dir="${build.dir}"/>
    </target>

    <target name="compile" depends="prepare" description="編譯 ">
    <javac srcdir="${src.dir}" destdir="${build.dir}">
    <classpath refid="build.classpath" />
    </javac>
    </target>

    <target name="ejbjar" depends="compile" description="創(chuàng)建EJB發(fā)布包">
    <jar jarfile="${basedir}\${ant.project.name}.jar" >
    <fileset dir="${build.dir}" >
    <include name="**/*.class"></include>
    </fileset>
    </jar>
    </target>

    <target name="deploy" depends="ejbjar" description="發(fā)布EJB">
    <copy file="${basedir}\${ant.project.name}.jar" todir="${jboss.home}\server\${jboss.server.config}\deploy"/>
    </target>

    <target name="undeploy" description="卸載EJB">
    <delete file="${jboss.home}\server\${jboss.server.config}\deploy\${ant.project.name}.jar"/>
    </target>
    </project>

    再右健點(diǎn)擊此配置文件build.xml,選擇Run As-->Ant Build即可!


    posted @ 2009-03-26 09:51 斷點(diǎn) 閱讀(158) | 評(píng)論 (0)

    posted @ 2010-01-13 22:39 斷點(diǎn) 閱讀(599) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共18頁(yè): First 上一頁(yè) 10 11 12 13 14 15 16 17 18 下一頁(yè) 
    主站蜘蛛池模板: 色拍自拍亚洲综合图区| 国产亚洲精久久久久久无码77777| 亚洲精品无码午夜福利中文字幕| 免费人成又黄又爽的视频在线电影| 亚洲av日韩av欧v在线天堂| 久久亚洲中文字幕无码| avtt亚洲天堂| 在线观看免费大黄网站| 免费无遮挡无码视频在线观看| 亚洲午夜精品在线| 国产成人综合久久精品免费| 国产特黄特色的大片观看免费视频| 久久久久亚洲精品无码系列| 又粗又大又黑又长的免费视频| 亚洲中文字幕久久精品蜜桃 | 亚洲午夜久久久久妓女影院| 麻豆高清免费国产一区| 亚洲成aⅴ人片久青草影院按摩| 亚洲精品综合久久| 国产成人精品免费视频网页大全| 亚洲卡一卡二卡乱码新区| 亚洲乱码国产一区网址| 精品无码国产污污污免费| jizz免费在线观看| 亚洲天堂电影在线观看| 亚洲中文字幕无码专区| 中文字幕无码视频手机免费看| 成年大片免费高清在线看黄| 亚洲黄色三级视频| 青青青国产色视频在线观看国产亚洲欧洲国产综合| 青青视频观看免费99| 国内精自视频品线六区免费 | 噜噜嘿在线视频免费观看| 成人看的午夜免费毛片| 青青操视频在线免费观看| 亚洲jjzzjjzz在线观看| 亚洲国产精品无码久久一线| 国产精品视_精品国产免费| 免费无码黄网站在线观看| 国产精品黄页在线播放免费| 免费人成在线观看网站视频|