EJB3.0_开发单表映射的实体bean
一、部署Jboss数据源
mysql的jdbc驱动复制到jboss服务器的lib目录中
修改jboss数据源配置文件:到jboss-5.1.0.GA\docs\examples\jca目录下找到对应的数据源配置文件,我用的是mysql,所以只修改mysql-ds.xml文件
修改成自己的mysql地址
<jndi-name>MysqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/bbs?useUnicode=true&characterEncoding=UTF-8</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>123456</password>
修改完保存到目录jboss-5.1.0.GA\server\default\deploy下,启动Jboss(我用的是Myeclipse启动Jboss),命令控制台看到
部署成功提示 JNDI name 'java:MysqlDS';
二、开发实体Bean
使用Myeclipse新建EJB项目,JNDI Data Source填写Jboss的JNDI name,前面的控制台可以看到,Persistence Unit Name自己命名,如:MysqlUnit
完成
引入Jboss所有的jar包到项目中
使用Myeclipse的Hibernate视图,EJB反向工程
点击完成
三、编写业务逻辑接口
我们来写一个接口
public interface DuserService {
public void delete(Integer id);
public Duser getDuser(Integer id);
public List<Duser> getDusers() ;
public void save(Duser user);
public void update(Duser user);
}
无状态会话Bean
@Stateless//设置成无状态会话Bean
@Remote(DuserService.class)//设置成远程Bean,公开“接口”
public class DuserServiceBean implements DuserService{
/*
* 注入EntityManager对象
* unitName要与persistence.xml文件中保持一致
*/
@PersistenceContext(unitName = "MysqlUnit")
EntityManager em;
public void delete(Integer id) {
/*
* em.getReference(Duser.class, id)
* 得到一个托管的实体对象
*/
em.remove(em.getReference(Duser.class, id));
}
public Duser getDuser(Integer id) {
return em.find(Duser.class, id);
}
@SuppressWarnings("unchecked")
public List<Duser> getDusers() {
return em.createQuery("select o from Duser o").getResultList();
}
public void save(Duser user) {
/*
* 保存新建状态对象,插入数据库,添加新纪录
*/
em.persist(user);
}
public void update(Duser user) {
/*
* 实体Bean处于游离状态,可以删除
*/
em.merge(user);
/*
* 托管状态,使用set方法就可以修改数据user.set*();
*/
}
}
我们发布到Jboss中,启动Jboss,在控制台中观察,
16:10:35,937 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
DuserServiceBean/remote - EJB3.x Default Remote Business Interface
DuserServiceBean/remote-cn.snailteam.entity.DuserService - EJB3.x Remote Business Interface
说明我们的DuserServiceBean无状态会话Bean已经部署成功。
四、测试
新建一个DuserService接口测试类
public class DuserServiceTest {
public static DuserService service;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
/*
* 参数来自于当前目录下的jndi.properties文件
*远程调用的话,通过jndi.properties找到会话Bean,如果在一个容器内的话
*(比如部署在同在一个EJB容器内既一个Jboss内),就不需要jndi.properties,
*直接在容器中初始化上下文,找到EJB会话Bean
*/
javax.naming.InitialContext ctx = new javax.naming.InitialContext();
/*
* Jboss启动控制台中可以观察到
* DuserServiceBean/remote - EJB3.x Default Remote Business Interface
*/
service = (DuserService) ctx.lookup("DuserServiceBean/remote");
System.out.println("初始化完成");
}
@Test
public void testDelete() {
}
@Test
public void testGetDuser() {
}
@Test
public void testGetDusers() {
List<Duser> users = service.getDusers();
for(Duser user:users){
System.out.println(user.getUid()+"-------"+user.getUsername());
}
}
@Test
public void testSave() {
}
@Test
public void testUpdate() {
}
}
测试之前我们需要设置初始化上下文件jndi.properties (可以查文档)
#Jboss命名连接工厂
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
#Jboss命名连接工厂地址
java.naming.provider.url=localhost:1099
可以测试了。