本文为原创,如需转载,请注明作者和出处,谢谢!
EJB3容器通过EntityManager对象管理实体Bean,该类最主要的功能就是在记录和JavaBean之间进行互相映射。例如,我们从数据库 中查出一条记录,这条记录有field1和field2两个字段,假设有一个JavaBean,也包含了field1和field2属性。那么 EntityManager可以将这条记录中的值映射到JavaBean的field1和field2属性中。也就是说,在数据库中的一条记录就对应于一 个JavaBean的对象实例。下面将给出一个简单的例子来演示如何来实现一个应用实体Bean的程序。在这个例子中使用无状态的session bean通过EntityManager对象从数据表中查找一条记录,将该记录映射成实体Bean的对象实例,最后通过session bean的方法返回该记录的某个字段值。
表名:t_users
表中的字段和记录
id name password_md5
1 bill TaokQpoNJQb02eafO/JgYw==
一、配置JBoss的数据库连接池
在<jboss安装目录>/server/default/deploy目录中建立一个mysql-ds.xml文件,内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <datasources>
- <local-tx-datasource>
- <jndi-name>MyPIM</jndi-name>
- <connection-url>jdbc:mysql://localhost:3306/pim</connection-url>
- <driver-class>com.mysql.jdbc.Driver</driver-class>
- <user-name>root</user-name>
- <password>1234</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>
mysql-ds.xml文件用于配置mysql的数据源。实际上,该文件可以在<jboss安装目录>/docs/examples/ jca目录中找到,读者只需要将数据库名、用户名和密码以及jndi名改成自己的就可以了。最后将修改后的mysql-ds.xml文件复制到 deploy目录中(必须叫这个文件名)。
连接mysql数据库需要一个jdbc驱动(jar文件),将该文件复制到<jboss安装目录>/server/default/lib目录中。
二、编写实体Bean
User类是一个实体Bean,代码如下:
- package entity;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.Id;
- import javax.persistence.Table;
- @Entity
- @Table(name = "t_users")
- public class User
- {
- private int id;
- private String name;
- private String password;
- @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;
- }
- @Column(name = "password_md5")
- public String getPassword()
- {
- return password;
- }
- public void setPassword(String password)
- {
- this.password = password;
- }
- }
三、配置persistence.xml文件
在META-INF目录中建立一个persistence.xml文件,代码如下:
- <?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">
- <persistence-unit name="myentity">
- <jta-data-source>java:/MyPIM</jta-data-source>
- <properties>
- <property name="hibernate.hbm2ddl.auto" value="none" />
- <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
- </properties>
- </persistence-unit>
- </persistence>
其中<jta-data-source>元素的值就是mysql-ds.xml文件中配置的数据源名。如果使用注释配置session bean,META-INF目录下只有两个文件即可:MANIFEST.MF和persistence.xml。
四、在session bean中调用实体bean
- package service;
- import java.util.ArrayList;
- import java.util.List;
- import javax.ejb.Stateless;
- import javax.persistence.EntityManager;
- import javax.persistence.PersistenceContext;
- import entity.User;
- @Stateless
- public class UserBean implements UserBeanRemote
- {
- @PersistenceContext(unitName="myentity")
- protected EntityManager em;
- @Override
- public String getPassword()
- {
- User user = em.find(User.class, 1);
- return user.getPassword();
- }
- }
其中UserBeanRemote为远程接口。要注意的是,@PersistenceContext注释的unitName属性值必须和persistence.xml文件中的<persistence-unit>元素的name属性值相同。
五、客户端调用session bean
由于本书的程序都在一个ear包中,因此,默认的jndi名是MyEnterprise/UserBean/remote,如果直接发布包含EJB的jar包,默认的jndi名称为UserBean/remote。
运行上面的代码后,将输出如下的字符串:
TaokQpoNJQb02eafO/JgYw==