现在咱们说一下EJB中最后一个Bean,实体Bean,那么他是干什么用呢?和数据库打交道,既然说到了和数据库打交道,那就不得不说还有一个东东:POJO,什么事POJO:POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。而且在EJB3.0有了以后,持久化已经自称规范,java persistence interface Api。
那么概念就简单的介绍到这里,下边我们说一下javaBean在EJB中的运用。先实现一个小小的例子,先感官的认识一下,然后再理性的介绍一下。
实例搭建
创建远程EJB项目
1.在D:\jboss-4.2.0.GA\server\default\lib 中加入 mysql-connector-java-5.1.5-bin.jar
2.在D:\jboss-4.2.0.GA\server\default\deploy 下加入文件mysql-ds.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: mysql-ds.xml 41017 2006-02-07 14:26:14Z acoliver $ -->
<!-- Datasource config for MySQL using 3.0.9 available from:
http://www.mysql.com/downloads/api-jdbc-stable.html
-->
<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/ejb3</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>root</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
3.新建ejb项目,并在persist.xml中加入
<persistence-unit name="jpa_01" transaction-type="JTA">
<jta-data-source>java:/MySqlDS</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
4.新建实体Person
package com.tgb.jpa;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Person {
@Id
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
}
5.新建javaBean
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
@Remote
public class PersonManagerBean implements PersonManager {
@PersistenceContext(unitName="jpa_01")
private EntityManager em;
public void addPerson(String name) {
Person p = new Person();
p.setId(1314);
p.setName("shuaige");
em.persist(p);
}
}
这样一个EJB的项目就创建好了,然后大家去自己的mysql中穿件一个名称为ejb3的数据库.
创建客户端
public static void main(String[] args) throws Exception{
InitialContext content = new InitialContext();
UserManager userManager = (UserManager)content.lookup("UserManager/remote");
for (int i = 0; i < 5; i++) {
User user = new User();
user.setUsername("帅哥" + i);
user.setPassword("1314");
userManager.addUser1(user);
System.out.println("User 添加成功");
}
}
jndi.properties文件中代码如下:
#\u5DE5\u5382\u5BF9\u8C61\u7684\u5305
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
#\u8BBE\u7F6E\u547D\u540D\u670D\u52A1\u5668\u7684\u8FDE\u63A5URL
java.naming.provider.url=localhost
#JNDI\u8FDE\u63A5\u5DE5\u5382
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
搭建好以后,启动我们的EJB项目,然后执行客户端代码就可以,我们就会看到如下结果:
详解JPA
在上边的代码大家注意到这么两句代码:
@PersistenceContext(unitName="jpa_01")
private EntityManager em;
EntityManager从字面意思可以看出就是一个实体管理工具,那么@PersistenceContext是干什么呢,持久化上下文,并且定义对于哪一个持久话对象(这里是jpa_01), PersistenceContext,称为持久化上下文,它一般包含有当前事务范围内的,被管理的实体对象(Entity)的数据。每个EntityManager,都会跟一个PersistenceContext相关联。PersistenceContext中存储的是实体对象的数据,而关系数据库中存储的是记录,EntityManager正是维护这种OR映射的中间者,它可以把数据从数据库中加载到PersistenceContext中,也可以把数据从PersistenceContext中持久化到数据库,EntityManager通过Persist、merge、remove、refresh、flush等操作来操纵PersistenceContext与数据库数据之间的同步!