专稿:实战EJB之五 开发实体BMP(EJB 1.1规范)

20、持久层开发:从 EJB 实体 Bean 到 JPA 的探索 本文深入探讨了从EJB实体Bean到JPA的持久层开发过程。首先介绍了EJB 2.1规范中的实体Bean,包括其特点、分类以及与会话Bean和MDB的区别,随后通过一个具体的示例,详细讲解了如何创建CMP Bean以实现游戏数据的持久化,并介绍了如何通过WTP开发JPA应用。文章还对EJB 2.1实体Bean和JPA进行了技术对比,分析了它们的适用场景,并给出了开发流程总结、常见问题及解决方案,最后展望了持久层开发技术的未来发展趋势。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

实战EJB系列

在以后的日子里,将由Jackliu向大家陆续提供一系列EJB教程,有学习EJB的朋友请同步参考EJB相关书籍,实战系列将以例程的方式帮助你理解这些基本的概念,其中将包括:

所有章节完毕后将制作成pdf电子文档,供大家下载

实战EJB之五 开发实体BMP(EJB 1.1规范)

前一节介绍了EntityBean的有关介绍,并通过开发、部署实体CMP的例子介绍EJB1.1规范的CMP的有关特性,在这一节中你将了解如下内容:

  • EJB 1.1规范中的BMP
  • 编写一个EJB 1.1 的BMP程序
  • 部署到应用服务器
  • 开发和部署测试程序
  • 运行测试程序

EJB 1.1规范中的BMP

根据规范中定义的EJB事务持久性(persistence)的特性被分为容器管理持久性(CMP)和Bean管理持久性(BMP)。虽然使用容器管理持久性给编程带来极大的方便,但是将事务持久性交于容器来控制降低了Bean的开发能力;BMP的Bean具有灵活的业务处理能力和更灵活的持久性控制能力,常用来映射一些复杂的数据视图或很难用CMP实现的复杂逻辑处理。

BMP的寿命周期和CMP的寿命周期管理机制是相同的,不同的是BMP的事务持久性管理机制交于Bean开发者,所以,在创建、更新、删除等数据库操作时,两种类型的Bean的顺序图是不一样的。为了说明这一点,可以从CMP和BMP在钝化/激活顺序图中分析,当然Bean的创建、查找、删除也是不同的:

通过图5-1和5-2的比较,我们很容易会发现:

CMP:当一个Bean实例被客户引用,并执行一个业务方法后,容器会自动读取Bean的实例字段(还记得我们在上一节在实现一个CMP时,为Bean定义了映射到数据库字段的Public型类字段吗),然后,通过容器与数据库发生关系,保存改变的数据,执行完毕后Bean被钝化,并调用ejbPassviate()方法通知Bean。当客户过一端时间又调用这个Bean的某业务方法时,被钝化的Bean又重新的激活,但是并不是马上执行这个业务方法,而是由EJB对象首先调用ejbActivate()方法通知Bean,Bean实例要激活,然后从数据库中提取数据,并自动将数据值映射到Bean实例,然后调用ejbLoad()方法,实例被再一次初始化,最后才开始执行要执行的业务方法,红色箭头和红色时间块做了明显的表示。

BMP:当一个Bean实例被客户引用,并执行一个业务方法后,容器会执行Bean的ejbStore()方法,并由这个方法把数据保存到数据库中(下面的例子你将会发现,我们不再为 Bean定义全局类变量,而是定义一些私有类变量),执行完毕后Bean被钝化,并调用ejbPassviate()方法通知Bean。当客户过一端时间又调用这个Bean的某业务方法时,被钝化的Bean又重新的激活,但是并不是马上执行这个业务方法,而是由EJB对象首先调用ejbActivate()方法通知Bean,Bean实例要激活,然后调用Bean的ejbLoad()方法,这个方法负责从数据库中提取数据,Bean实例被初始化,最后才开始执行要执行的业务方法。

<图5-1>

<图5-2>

BMP Bean要求所有的数据库操作都要由Bean实例完成,这些方法基本上包括:

setXXX():因为BMP不在为容器声明public类型的由容器来管理的映射字段,所以setXX方法需要开发者实现

getXXX(): 取得Bean字段值

ejbCreate():在CMP中,由容器实现,并返回一个NULL值,在BMP中必须由开发者自己实现,返回创建记录的主键值

ejbLoad(): 在CMP中,由容器实现,在BMP中必须由开发者自己实现,以实现组件非持久性状态缓存持久性信息

ejbStore():在CMP中,由容器实现,在BMP中必须由开发者自己实现,将信息从组件的非持久性状态转到持久性状态

ejbRemove():在CMP中,由容器实现,在BMP中必须由开发者自己实现

unsetEntityContext():在情境要求被释放时,释放在setEntityContext()中缓存的情境资源和取得的资源

setEntityContext():设置情境资源,初始化数据库连接对象

ejbActivate(): 在CMP中,由容器实现,在BMP中必须由开发者通过情境参数设置主键值

ejbPassivate():在CMP中,由容器实现,在BMP中必须由开发者取消Bean与数据库记录的持久性工作,进入钝化状态

ejbFindByPrimaryKey():在CMP中,由容器实现,在BMP中必须由开发者自己实现

ejbFindXXX():在CMP中,由容器实现,在BMP中必须由开发者自己实现

总体来看,在规范1.1中,CMP和BMP各有千秋,从机制上没有实质的差异,对于客户端的引用是不会察觉到两者的使用差异。不过是一个善于开发,灵活性小,且增加了部署工作(字段映射、编写SQL处理语句);另一个不善于开发,灵活性大,部署工作较少(没有了字段影射等麻烦,但却增加了配置外部引用资源[因为Bean会通过一个JNDI来查找数据库连接池],移植性较CMP差)。关于BMP的寿命周期请参看上一节介绍的EntityBean寿命周期

编写一个EJB 1.1 的BMP程序

上一节编写了一个CMP的例子,同样我们可以试者将它改写成一个BMP,假设功能需求不变化(功能介绍参看第四节的相关章节),为这个BMP起名为Bmp1Book 设计一个BMP Bean与CMP同样至少包括四个步骤:

  1. 开发主接口
  2. 开发组件接口
  3. 开发Bean实现类
  4. 编写部署文件

1.开发主接口(Bmp1BookHome.java):

主接口的设计与CMP的主接口设计一样,参照上一节主接口的设计,改动之处用黑体加粗显示。

Bmp1BookHome.java代码:


import java.util.Collection;

import java.rmi.RemoteException;

import javax.ejb.*;

//EJB BMP 1.1实战例子

public interface Bmp1BookHome extends EJBHome{

   public Bmp1Book create(String bookid,String bookname,double bookprice)

     throws RemoteException,CreateException;

   //按主键[bookid字段]查找对象

   public Bmp1Book findByPrimaryKey(String bookid)

     throws FinderException,RemoteException;

   //查找定价符合范围内的图书,将结果放到Collection中  

   public Collection findInPrice(double lowerLimitPrice,double upperLimitPrice)

     throws FinderException,RemoteException;

}

假设我们保存到D:/ejb/Bmp1Book/src/Bmp1BookHome.java

2.开发组件接口(Bmp1Book.java):

组件接口的设计与CMP的组件接口设计一样,参照上一节组件接口的设计,改动之处用黑体加粗显示。

Bmp1Book.java代码:




import javax.ejb.EJBObject;

import java.rmi.RemoteException;

//EJB BMP 1.1实战例子

public interface Bmp1Book extends EJBObject{

   public void setBookName(String bookname) throws RemoteException;

   public void setBookPrice(double bookprice) throws RemoteException;

   public String getBookName() throws RemoteException;

   public double getBookPrice() throws RemoteException;

}

假设我们保存到D:/ejb/Bmp1Book /src/Bmp1Book .java

3.开发Bean实现类(Bmp1BookEJB.java):

最大的改动是Bean的实现类,这个类里将包括更多SQL实现的细节代码。首先要引用更多的开发包:java.sql.*;javax.sql.*;javax.naming.*; Bean不在声明全局的类变量,类变量的映射改较给Bean来管理。另外,还需要声明一个EntityContext情境变量,我们将通过这个变量的getPrimaryKey()方法得到保存在情境中的主关键字值,以便在Bean在激活时重新初始化Bean数据。因为要对数据库直接操作,所以我们要定义一个DataSource对象,在Bean初始化时从连接池中取得一个有效数数据库对象。定义的Connect对象将在获取一个数据库连接时被引用。dbjndi存放了一个获得数据库资源的JNDI名。改造后的Bmp1BookEJB如下: Bmp1BookEJB.java代码:




import java.util.*;

import javax.ejb.*;

//引入sql处理包

import java.sql.*;

import javax.sql.*;

import javax.naming.*;





//EJB BMP 1.1实战例子

public class Bmp1BookEJB implements EntityBean{

   //保存bookid字段值

   private String bookid;

   //保存bookname字段值

   private String bookname;

   //保存bookprice字段值

   private double bookprice;

   



   private EntityContext ctx;

   private DataSource ds;

   private String dbjndi="java:comp/env/jdbc/oadb";

   private Connection con;

   

   

   

   public void setBookName(String bookname){

     this.bookname=bookname;

   }

   

   public void setBookPrice(double bookprice){

     this.bookprice=bookprice;

   }

   

   public String getBookName(){

     return this.bookname;

   }

   

   public double getBookPrice(){

     return this.bookprice;

   }

   

   //BMP需要Bean提供数据的插入

   public String ejbCreate(String bookid,String bookname,double bookprice)

     throws CreateException{

     

     if(bookid==null)

       throw new CreateException("The bookid is required");

     

     try{

       String sql="INSERT INTO BOOK VALUES(?,?,?)";

       con=ds.getConnection();

       PreparedStatement stmt =con.prepareStatement(sql);

       stmt.setString(1,bookid);

       stmt.setString(2,bookname);

       stmt.setDouble(3,bookprice);

       stmt.executeUpdate();

       stmt.close();

     }catch (SQLException se){

       throw new EJBException(se);

     }finally{

       try{

         if(con!=null)

           con.close();

       }catch(SQLException se){}

     }

     

     this.bookid=bookid;

     this.bookname=bookname;

     this.bookprice=bookprice;

     //由Bean负责事务持久性,Bean负责返回主键值

     return bookid;

   }

   

   public void ejbPostCreate(String bookid,String bookname,double bookprice){}

   

   //根据bookid值提取数据

   public void ejbLoad(){

     try{

       String sql="SELECT BOOKID,BOOKNAME,BOOKPRICE FROM BOOK WHERE BOOKID=?";

       con=ds.getConnection();

       PreparedStatement stmt =con.prepareStatement(sql);

       stmt.setString(1,this.bookid);

       ResultSet rset=stmt.executeQuery();

       if(rset.next()){

         this.bookname=rset.getString("BOOKNAME");

         this.bookprice=rset.getDouble("BOOKPRICE");

         stmt.close();

       }else{

         stmt.close();

         throw new NoSuchEntityException("BOOK ID:" this.bookid);

       }

       

     }catch (SQLException se){

       throw new EJBException(se);

     }finally{

       try{

         if(con!=null)

           con.close();

       }catch(SQLException se){}

     }

   

   }



   //保存被关联的数据记录

   public void ejbStore(){

     try{

       String sql="UPDATE BOOK SET BOOKNAME=?,BOOKPRICE=? WHERE BOOKID=?";

       con=ds.getConnection();

       PreparedStatement stmt =con.prepareStatement(sql);

       stmt.setString(1,this.bookname);

       stmt.setDouble(2,this.bookprice);

       stmt.setString(3,this.bookid);

       if(stmt.executeUpdate()!=1){

         stmt.close();

         throw new EJBException("occount a error on saved");

       }

       stmt.close();       

     }catch (SQLException se){

       throw new EJBException(se);

     }finally{

       try{

         if(con!=null)

           con.close();

       }catch(SQLException se){}

     }

      

   }

   

   //删除关联的记录

   public void ejbRemove(){

     try{

       String sql="DELETE FROM BOOK  WHERE BOOKID=?";

       con=ds.getConnection();

       PreparedStatement stmt =con.prepareStatement(sql);

       stmt.setString(1,this.bookid);

       if(stmt.executeUpdate()!=1)

         throw new EJBException("occount a error on remove");

       stmt.close();       

     }catch (SQLException se){

       throw new EJBException(se);

     }finally{

       try{

         if(con!=null)

           con.close();

       }catch(SQLException se){}

     }   

   }

   

   

   public void unsetEntityContext(){

     this.ctx=null;

   }

   //初始化数据库连接,初始化情境参数

   public void setEntityContext(EntityContext context){

     this.ctx=context;

     

     try{

       InitialContext initial =new InitialContext();

       ds=(DataSource)initial.lookup(this.dbjndi); 

     }catch(NamingException ne){

       throw new EJBException(ne);

     }

   }

   

   //在Bean激活时,从情境参数中获取Bean的主键值,然后会自动调用ejbLoad()

   public void ejbActivate(){

     this.bookid=(String)ctx.getPrimaryKey();

   }

   

   //解除当前Bean实例与数据库记录的关系

   public void ejbPassivate(){

     this.bookid=null;

   }

   

   //根据主键查找对象

   public String ejbFindByPrimaryKey(String primarykey)

     throws FinderException{

     

     try{

       String sql="SELECT BOOKID FROM BOOK WHERE BOOKID=?";

       con=ds.getConnection();

       PreparedStatement stmt =con.prepareStatement(sql);

       stmt.setString(1,primarykey);

       ResultSet rset=stmt.executeQuery();

       if(!rset.next()){

         stmt.close();

         throw new ObjectNotFoundException();

       }

       stmt.close();

       //查到数据库中存在此条记录

       return primarykey;

     }catch (SQLException se){

       throw new EJBException(se);

     }finally{

       try{

         if(con!=null)

           con.close();

       }catch(SQLException se){}

     }     

   }

   

   //查找书单定价在指定范围内的Bean的集合

   public Collection ejbFindInPrice(double lowerLimitPrice,double upperLimitPrice)

     throws FinderException{

  

     try{

       String sql="SELECT BOOKID FROM BOOK WHERE BOOKPRICE BETWEEN ? AND ?";

       System.out.println(sql);

       con=ds.getConnection();

       PreparedStatement stmt =con.prepareStatement(sql);

       stmt.setDouble(1,lowerLimitPrice);

       stmt.setDouble(2,upperLimitPrice);

       ResultSet rset=stmt.executeQuery();

       

       ArrayList booklist=new ArrayList();

       while(rset.next())

         booklist.add(rset.getString("BOOKID"));

         

       stmt.close();



       return booklist;

     }catch (SQLException se){

       throw new EJBException(se);

     }finally{

       try{

         if(con!=null)

           con.close();

       }catch(SQLException se){}

     }       

   }

}

假设我们保存到D:/ejb/Bmp1Book/src/Bmp1BookEJB .java

到此为止我们的Bean程序组件已经改写完毕了,使用如下命令进行编译:


cd bean/Bmp1Book

mkdir classes

cd src

javac -classpath %CLASSPATH%;../classes -d ../classes  *.java

如果顺利你将可以在../Bmp1Book/classes目录下发现有三个类文件。

4.编写部署文件:

ejb-jar.xml文件:




<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">

<ejb-jar>

    <description>    

        This is BMP 1.1 Book EJB example

    </description>

    <display-name>Bmp1BookBean</display-name>

    <enterprise-beans>

        <entity>

            <display-name>Bmp1Book</display-name>

            <ejb-name>Bmp1Book</ejb-name>

            <home>Bmp1BookHome</home>

            <remote>Bmp1Book</remote>

            <ejb-class>Bmp1BookEJB</ejb-class>

            <persistence-type><b>Bean</b></persistence-type>

            <prim-key-class>java.lang.String</prim-key-class>

            <reentrant>False</reentrant>

            <b><resource-ref>

               <res-ref-name>jdbc/oadb</res-ref-name>

               <res-type>javax.sql.DataSource</res-type>

               <res-auth>Container</res-auth>

            </resource-ref> </b>                       

        </entity>

    </enterprise-beans>

    <assembly-descriptor>

      <container-transaction>

        <method>

          <ejb-name>Bmp1Book</ejb-name>

          <method-name>*</method-name>

        </method>

        <trans-attribute>NotSupported</trans-attribute>

      </container-transaction>

    </assembly-descriptor>

</ejb-jar>

假设我们保存到D:/ejb/Bmp1Book/classes/META-INF/ejb-jar.xml(注意META-INF必须大写)

现在让我们看看当前的目录结构:


Bmp1Book <文件夹>

  classes<文件夹>

    META-INF<文件夹>

      ejb-jar.xml

    Bmp1Book .class

    Bmp1Book EJB.class

    Bmp1BookHome.class

  src<文件夹>

    Bmp1Book.java

    Bmp1BookEJB.java

    Bmp1BookHome.java

部署到应用服务器

在部署之前我们需要将这些类文件和xml文件做成一个jar文件,EJB JAR文件代表一个可被部署的JAR库,在这个库里,包含了服务器代码与EJB模块的配置。ejb-jar.xml文件被放置在JAR文件所指定的META-INF目录中。我们可以使用如下命令得到EJB JAR文件:


cd d:/ejb/Bmp1Book/classes    (要保证类文件在这个目录下,且有一个META-INF子目录存放ejb-jar.xml文件)

jar -cvf  bmp1Book.jar *.*

确保bmp1Book.jar文件包括的文件目录格式如下:


 META-INF<文件夹>

    ejb-jar.xml

 InsufficientFundException.class

 StatefulAccount.class

 StatefulAccountEJB.class

 StatefulAccountHome.class

部署工具一般由Java应用服务器的制造商提供,在这里我使用了Apusic应用服务器,并讲解如何在Apusic应用服务器部署这个组件。如果使用其他部署工具,原理是一样的。要使用Apusic应用服务器,可以到www.apusic.com上下载试用版。

确定你的Apusic服务器已经被启动。 打开"部署工具"应用程序,点击文件->新键工程:

第一步:选择"新建包含一个 EJB组件打包后的EJB-jar模块"选项

第二步:选择一个刚才我们生成的bmp1Book.jar文件

第三步:输入一个工程名,可以随意,这里我们输入bmp1Book

第四步:输入工程存放的地址,这里我们假设被存放到D:/ejb/bmp1Book/deploy目录下

完成四个步骤后,如果没有问题将出现bmp1BookBean的部署界面,基本的参数配置已经在我们刚才编写的ejb-jar.xml中定义,虽然我们在部署时免去了映射字段、编写SQL操作语句的要求,但是需要提供一些BMP特性的配置:

选择bmp1Book的配置页,点击"4.资源引用",画面上应该出现了我们在ejb-jar.xml文件中设置的数据库引用,我们设置一下共项范围和JNDI名,设置后的画面如下图5-3:

<图5-3>

上述步骤完成后就可以点击部署->部署到Apusic应用服务器完成部署工作。

开发和部署测试程序

对于客户端,引用BMP实例的方式和引用CMP实例的方式是一样的,所以我们不需要改动上一节的servlet程序,只需做少许改动: Bmp1BookServlet .java文件:


….

public class Bmp1BookServlet extends HttpServlet{

  ……

}

假设我们将文件保存到D:/ejb/Bmp1Book/src/Bmp1BookServlet.java

使用如下命令编译Servlet




cd D:/ejb/Bmp1Book

mkdir test

cd test

mkdir WEB-INF

cd WEB-INF

mkdir classes

cd D:/ejb/Bmp1Book/src

javac -classpath %CLASSPATH%;../classes/ -d ../test/WEB-INF/classes Bmp1BookServlet.java

编译成功后将这个servlet部署到与Bmp1Book同一工程中,在部署前需要我们编写一个web.xml,并制作成一个Web模块文件(war文件) web.xml文件内容如下:




<?xml version="1.0" encoding="UTF-8"?>



<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>



<web-app>

  <icon>

    <small-icon></small-icon>

    <large-icon></large-icon>

  </icon>

  <display-name>Bmp1BookServlet</display-name>

  <description></description>

  <context-param>

    <param-name>jsp.nocompile</param-name>

    <param-value>false</param-value>

  </context-param>

  <context-param>

    <param-name>jsp.usePackages</param-name>

    <param-value>true</param-value>

    <description></description>

  </context-param>

  <ejb-ref>

    <description></description>

    <ejb-ref-name>ejb/Bmp1Book</ejb-ref-name>

    <ejb-ref-type>Entity</ejb-ref-type>

    <home>Bmp1BookHome</home>

    <remote>Bmp1Book</remote>

    <ejb-link>Bmp1Book</ejb-link>

  </ejb-ref>

</web-app>

假设我们将文件保存到D:/ejb/Bmp1Book/test/WEB-INF/web.xml

J2EE Web应用可以包括Java Servlet类、JavaServer Page组件、辅助的Java类、HTML文件、媒体文件等,这些文件被集中在一个War文件中。其中War结构具有固定的格式,根目录名为WEB-INF,同一目录下应该有一个web.xml文件,用来描述被部署文件的部署信息,Jsp、html等文件可以放置在这个目录下,同时WEB-INF目录下可能存在一个classes目录用于存放Servlet程序,如果引用了一些外部资源,则可以被放置到WEB-INF/lib目录下。使用下面的命令生成这个Servlet测试程序的war文件:




cd D:/ejb/Bmp1Book/test/

jar -cvf bmp1Book.war *.*

确保bmp1Book.war文件包括的文件目录格式如下:


WEB-INF<文件夹>

 classes<文件夹>

   bmp1BookServlet.class

 web.xml

成功编译后,将这个servlet一同部署到bmp1Book工程中,我们回到"部署工具",点击编辑à填加一个Web模块,选择我们刚刚编译成的bmp1Book.war文件 点击部署->部署到Apusic应用服务器完成部署工作。

运行测试程序

打开浏览器,在浏览器中输入:


http://localhost:6888/bmp1Book/servlet/Bmp1BookServlet



localhost-Web Server的主机地址

:6888-应用服务器端口,根据不同的应用服务器,端口号可能不同

/bmp1Book-部署servlet时指定的WWW根路径值

/servlet-ejb容器执行servlet的路径

/Bmp1BookServlet-测试程序

如果运行正常,运行的结果应该和上一节CMP的例子相同

39、深入探索实体 Bean:开发、部署与使用 本文深入探讨了实体 Bean 的开发、部署与使用,涵盖了实体 Bean 的生命周期、CMP 与 BMP 的区别、EJB 2.0 与 EJB 1.1 的对比、主键与接口的设计、开发与部署流程、性能优化策略以及错误处理方法。通过详细的代码示例和流程图,帮助开发者全面理解并高效运用实体 Bean 构建企业级应用程序。 阅读详情

相关推荐

BMP学习EJBBMP学习EJB

BMP学习 EJBBMP学习 EJBBMP学习 EJBBMP学习 EJBBMP学习 EJB

实体Bean的BMP和CMP选择

EJB有两种主要类型BMP(Bean managed persistence )和CMP(Container managed persistence ),这两种类型各有优缺点。 BMP是在Bean中完成对数据库JDBC的各种调用,也就是说,在你的实体bean(entity bean)中,明确写入了SQL语句,如"insert .. "或"select ..",并且使用Datasource获得...

挨踢也疯狂 - 菠菜 305

ejb-1.1.jar

这个就不介绍啦,谁需要谁下吧!

专稿:实战EJB之四 开发实体CMP(EJB 1.1规范)

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 684

yanshee 机器人全流程指南

2.点击yanshee app右上角根据提示操作 3.当手机显示成功连接 ,按下机器人胸前按钮说出“ip地址”4.根据机器人播报的ip地址加上:8888使用浏览器访问,你就会看到 jupyterd的界面,里面可以新建文件也可以改他存在的文件。我们使了yanshee机器人,这个是面向K12、中高职、高校学生推出的开源人形机器人教育平台,应用于课程教学、竞赛、科研活动等场景。我们接下来可以根据这些apl做许多好玩的,比如控制他运动,跳舞唱歌,it`s easy。注意电脑,手机,机器人必须连同一个网。

qq_44827929的博客 7613

FPGA与GPU异构计算:重塑嵌入式AI的算力边界与场景定义

本文深入探讨了FPGA与GPU异构计算如何突破嵌入式AI的算力瓶颈。通过分析工业视觉、智能交通及航天等场景,阐述了FPGA负责高速数据采集与预处理,GPU专注复杂AI推理的协同模式,有效解决了传统单一架构在算力、功耗、接口和实时性上的挑战,为嵌入式AI应用提供了高效能解决方案。

spice的博客 486

EJB的发展历史

EJB的发展历史 转自:http://book.51cto.com/art/201008/220992.htm 8.1.2 EJB的发展历史 http://book.51cto.com 2010-08-21 17:25 李刚 电子工业出版社 我要评论(0) 摘要:《经典Java EE企业应用实战:基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发》第8章会话E...

xiaosu502的博客 371

告别手动复制粘贴:3种高效合并Excel表格的方法对比(含代码)

本文对比了VBA、Power Query和Python三种高效合并Excel表格的方法,并提供了可直接运行的代码。针对不同数据量、更新频率和技术背景,详细分析了各方案的优缺点与适用场景,帮助读者告别低效的手动操作,实现自动化数据整合。

weixin_29057237的博客 442

EJB

转载-维基百科 企业级JavaBean(Enterprise JavaBean, EJB)是一个用来构筑企业级应用的服务器端可被管理组件。 Java企业版API(Java Enterprise Edition)中提供了对EJB的规范。EJB是一个封装有某个应用程序之业务逻辑服务器端组件。EJB最早于1997年由IBM提出,旋即被太阳微系统采用并形成标准(EJB 1.0 和EJB 1.1

winter2summer的博客 1074

Appstore 3.2(f)违规自救指南:从触发到申诉的完整应对策略

本文详细解析了Appstore 3.2(f)违规的应对策略,从触发原因到申诉流程,帮助开发者有效自救。文章涵盖隐瞒行为、账户关联和信息造假三大违规场景的判定逻辑,并提供申诉信写作的黄金法则和长期合规防御措施,确保开发者能够顺利通过苹果审核。

weixin_29304985的博客 662

Python 爬虫实战:亚马逊 + eBay 商品信息跨平台抓取(价格 / 销量 / 评价对比)

亚马逊和 eBay 是全球知名的电商平台,拥有海量的商品信息。对于消费者来说,比较不同平台上的商品价格、销量和用户评价可以帮助他们找到性价比最高的商品。对于商家而言,了解竞争对手的商品信息有助于优化自身的产品策略和定价策略。然而,手动在两个平台上逐一比较商品信息是非常耗时且低效的。因此,开发一个能够自动抓取并对比这两个平台商品信息的爬虫工具具有重要的实际意义。

yansideyucsdn的博客 617

EJB的使用软件架构9

EJB的使用 <一>实验目的: 1.学习和了解J2EE的EJB规范; 2.使用会话EJB (stateful & stateless); 3.使用会话实体EJB (BMP & CMP)。 <二> 实验内容: EJB简介: EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序,类似微软的.com技术。凭借java跨平台的优势,用EJB...

weixin_30824479的博客 246

OpenCV-Python实战(3)——OpenCV中绘制图形与文本

OpenCV 是一个的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。本文介绍了 OpenCV 提供的与绘制图形和文本相关的函数。在图形方面,我们了解了如何绘制基本图形(直线、矩形和圆形等)以及高级图形(剪裁线、箭头、椭圆和多边形)。在文本方面,我们了解了如何绘制文本以及 OpenCV 库中的所有可用字体。

盼小辉丶的博客 2万+

技术演进中的开发沉思-172 java-EJB: 实体 Bean的问题

摘要:EJB2.x时代的实体Bean曾被寄予厚望,试图将ORM与分布式功能结合,却因设计缺陷沦为"反面教材"。其CMP模式配置复杂且性能低下,BMP模式又过于繁琐,最终因笨重架构、性能问题和缺乏灵活性被淘汰。EJB3.0通过引入轻量化的JPA规范实现救赎,采用注解替代XML配置,支持灵活查询,并与EJB解耦。实体Bean的失败启示技术设计需专注核心需求,避免过度复杂化。这段历史展现了Java持久化技术从错误走向成熟的演进历程。

你的天空阅读专栏 1170

《用 R 探索医药数据科学》目录(持续更新,已超 250 万字)|订阅前说明

我们重磅推出《用 R 探索医药数据科学》专栏!本文作为专栏【订阅后首读】的核心内容,堪称开启学习之旅的 “入门钥匙”,也是整个专栏最关键的一篇指引文。文中不仅完整呈现了专栏 9 大核心篇章 + 问答板块的详细目录,更囊括了订阅后必知的核心要点 —— 从阅读设备、实操工具的使用建议,到学习路径、更新规则的清晰说明,再到问题反馈、感悟记录的实用方法,一站式帮你摸清专栏框架、找准学习方向。建议各位订阅者务必认真阅读、吃透内容,这能让你后续的学习更高效、少走弯!

MD Code 1万+

风控域——知识图谱相关原理

本文全面介绍了知识图谱在风控领域的应用原理。从基础知识入手,阐述了知识图谱的定义、概念及应用场景,重点聚焦于金融风控。进一步讲解了知识图谱的技术架构,涵盖计算、融合与构建等方面。深入探讨了知识表示、建模、抽取、挖掘、存储、融合、检索和推理等关键技术原理,并结合金融风控实际需求,详细说明了各技术环节的具体应用方法与流程,为构建高效风控知识图谱提供了理论与实践指导。

庄小焱 608

J2EE 组件开发:实体EJB

 提纲: ====================== 一、概述   1.1 持久化   1.2 共享访问   1.3 主键   1.4 关系 二、实体Bean与JDBC 三、实体EJB组件   3.1 Bean管理的持久化   3.2 容器管理的持久化 ======================== 正文: ======================== 一、概述 实体Bean代表着

专注于基于J2EE框架的B/S结构解决方案研究 1232

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

J2EE 组件开发 实体EJB 上

J2EE 组件开发 实体EJB 上

hfdhjjj的博客 246

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

J2EE 组件开发:实体EJB(上)

提纲: ====================== 一、概述   1.1 持久化   1.2 共享访问   1.3 主键   1.4 关系 二、实体Bean与JDBC 三、实体EJB组件   3.1 Bean管理的持久化   3.2 容器管理的持久化 ======================== 正文: ======================== 一、概述 实体Bean代表着持久性数据

键者天行 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

[转载]有效的实体 EJB 开发

有效的实体 EJB 开发随着越来越多的程序员在其项目中使用 Enterprise JavaBean (EJB) 组件,对简化 EJB 开发的工具需求也日渐增长。本文讨论容器管理的持久性 (CMP) 实体 Enterprise ...

congji3817的博客 217

J2EE 组件开发 实体EJB(上)

J2EE 组件开发 实体EJB(上)

qq_43679507的博客 278

EJB CMP/BMP

EJB有两种主要类型BMP(Bean    managed    persistence    )和CMP(Container    managed    persistence    ),这两种类型各有优缺点。          BMP是在Bean中完成对数据库JDBC的各种调用,也就是说,在你的实体bean(entity    bean)中,明确写入了SQL语句,如"insert    .. 

Halcyon,come on 1187

Eclipse + jboss开发EJB详细步骤

BMP和CMP同属EJB2.x规范中定义的实体Bean(Entity Bean),一个实体Bean是由多个类和接口组成,我们可以认为一个实体Bean代表数据库中的一个表(姑且这么认为),一个实体Bean的一个具体对象代表该表中的一条记录。也就是说,实体Bean是位于数据库和用户应用之间的数据中间件.这个数据中间件由EJB容器负责管理,具体来说也即:当实体Bean部署时,EJB容器通过ejbLoad

天山童老的专栏 2876

实体CMP-EJB和Hibernate大比拼

导读:   J2EE领域热切的盼来了一种非常流行的开源技术,它就是Hibernate.这个技术被提升到JCP(一种Java规范组织)标准中去了。从J2EE开发者反馈的信息来看,掌握Hibernate知识是所有想在J2EE领域有所作为的人的必修课。   Hibernate是一个对象关系映射的技术。它是一个开源,并且免费的技术,由SourceForge. Net开发。在过去,有许多的类似的对象

黑客攻防 | .net 源代码下载 | ASP.NET开发 | ORACLE数据库开发 | JAVASCRIPT脚本下载 | java源码下载 715

技术演进中的开发沉思-167 java-EJB:EJB 在我眼里的印记

本文回顾了EJB作为Java企业级开发标志性技术的历史地位与演进过程。EJB曾是企业级开发的标杆,通过标准化组件模型解决了分布式系统的核心问题。经历了从1.x/2.x版本复杂繁琐到3.x版本注解驱动、POJO化的重大改进,但最终因重量级容器和生态局限被Spring框架超越。作者指出,虽然EJB已非主流,但其开创的容器化、声明式事务等思想仍深刻影响着现代开发框架,且在银行、电信等传统系统中仍有应用。建议开发者了解EJB历史,把握技术演进脉络,但应专注于SpringBoot等主流技术。

你的天空阅读专栏 648

EJB是什么?有什么优点?

企业级JavaBean(Enterprise JavaBean,EJB)是一个用来构筑企业级应用的服务器端可被管理组件。(一种技术规范) EJB容器可以接受三类EJB 1)会话Bean(Session Beans) ①无状态会话Bean(Stateless Session Beans) ②有状态会话Bean(Stateful Session Beans) ...

pi_lily_kaqiu的博客 1921
上一篇: 一个jsp聊天系统
下一篇: next-generation Web应用程序开发包(url)
java169
博客等级 码龄18年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值