Hibernate实战_笔记11(EJB容器JBoss)(一)

2014-11-24 01:37:10 · 作者: · 浏览: 0

引入EJB组件

当你还使用EJB3.0会话bean和消息驱动的bean(和其他Java EE5.0标准)时,Java Persistence就开始初露锋芒。EJB3.0规范已经被设计为允许持久化的整合,因为你可以在Bean方法范围获得自动的事务划分,或者跨越状态会话EJB生命周期的一个持久化上下文(如Session)。
这次内容是从一个托管的JavaEE环境中的EJB3.0和JPA开始,你将再次通过修改“Hello World”应用程序学习基础的知识。首先需要Java EE环境――提供JavaEE服务的运行时容器。

建议大家使用JBoss(RedHat一款开源JavaEE服务器)

JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3.0的规范。
http://sourceforge.net/projects/jboss/files/JBoss/JBoss-4.2.3.GA/
如果你安装的JDK是1.5版本(请选择jboss-4.2.3.GA.zip文件 下载),如果你安装的jdk是1.6版本,请选择jboss-4.2.3.GA-jdk6.zip文件下载。下载后直接解压缩文件即可完成安装,为了避免应用出现莫名的错误,解压缩的路径最好不要带空格和中文。
启动JBoss
进入jboss的bin目录,找到启动脚本run.bat。双击run.bat即可启动jboss。
如果启动出错,请检查下列情况
1、端口是否被占用,如:8080、1099
2、是否为JDK设置了JAVA_HOME和ClassPath系统变量
3、检查jboss所用的jdk是否1.5以上版本,这些信息可以在jboss的控制台观察到
4、如果启动时出现这样的错误:“findstr不是内部或外部命令,也不是可运行的程序或批处理文件”。那么应该在系统变量Path中追加“%SystemRoot%\system32;%SystemRoot%;”。
否则最后的办法就是重装机器上的JDK咯。
还有就是为jboss设置JBOSS_HOME系统变量,系统变量里添加JBOSS_HOME变量,值为jboss的安装路径。
为了方便输入jboss的命令,我们把jboss的bin目录添加到系统路径里。

引入EJB组件前先学习一点EJB基础内容。。。

EJB中的三种bean

1、会话bean(session bean)
负责与客户端交互,是编写业务逻辑的地方,在bean可以通过jdbc直接操作 数据库,但大多数情况下都是通过实体bean来完成对数据库的操作。
2、实体bean(entity bean)
它实际上属于java持久化规范(简称JPA)里的技术,JPA的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、TopLink等ORM框架各自为营的局面。
3、消息驱动bean(message-driven bean)

它是专门用于异步处理java消息的组件,具有处理大量并发消息的能力。


会话bean
1)无状态会话bean
平常,我们使用最多的是无状态bean,因为它的bean实例可以供多个用户使用,所以它的性能比有状态bean高,正因为一个bean实例被多个用户使用,前一个用户设置的值有可能被后一个用户所修改,所以它无法正确保存某个用户设置的值,因此是无状态的。
2)有状态会话bean
有状态bean平常使用的并不多,因为它的一个bean实例只供一个用户使用,所以性能开销比较大,正因为它的实例只被一个用户使用,所以用户设置的值不会被其他用户所修改,所以可以正确保存用户设置的值,因此是有状态的。

如何开发一个无状态的会话bean

1)接口(接口可以是远程接口或本地接口)
2)实现类

操作步骤:

1)打开IDE开发工具(我使用的是MyEclipse)
2)导入jboss\client目录下的所有jar文件
3)编写接口
package cn.jbit.ejb3.dao;


public interface HelloWorldDao {


	public String sayHelloWorld();
}
4)编写实现类
package cn.jbit.ejb3.dao.impl;


import javax.ejb.Remote;
import javax.ejb.Stateless;


import cn.jbit.ejb3.dao.HelloWorldDao;


@Stateless
// 无状态会话bean
@Remote(HelloWorldDao.class)
// 远程接口
public class HelloWorldDaoImpl implements HelloWorldDao {
	
	public String sayHelloWorld() {
		return "HelloWorld";
	}
}
5)打包

File->Export->Java->JAR file,截图

\

6)发布
打包的jar包复制到jbZ http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ncc2VydmVyXGRlZmF1bHRcZGVwbG95vfjQ0MjIsr/K8Dxicj4Kv6q3okVKQrXEv827p7bLPGJyPgo8cHJlIGNsYXNzPQ=="brush:java;">package cn.jbit.ejb3.test; import javax.naming.InitialContext; import javax.naming.NamingException; import cn.jbit.ejb3.dao.HelloWorldDao; public class Test { public static void main(String[] args) { try { InitialContext ctx = new InitialContext(); HelloWorldDao dao = (HelloWorldDao) ctx .lookup("HelloWorldDaoImpl/remote"); System.out.println(dao.sayHelloWorld()); } catch (NamingException e) { e.printStackTrace(); } } }注意在src目录添加jndi.properties(JNDI生成策略)
内容如下:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:1099

JBoss默认生成的JNDI名称
当EJB发布到JBoss时,如果我们没有为它指定全局JNDI名称或修改过其默认EJB名称,JBoss就会按照默认的命名规则为EJB生成全局JNDI名称,默认的命名规则如下:
如果把EJB应用打包成后缀为*.jar的模块文件,默认的全局JNDI名称是
1)本地接口:EJB-CLASS-NAME/local
2)远程接口:EJB-CLASS-NAME/remote

如果把EJB作为模块打