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
InitialContext ctx = new InitialContext();
UserBeanRemote userBeanRemote = (UserBeanRemote) ctx.lookup ("MyEnterprise/UserBean/remote");
System.out.println(userBeanRemote.getPassword());
由於本書的程序都在一個ear包中,因此,默認的jndi名是MyEnterprise/UserBean/remote,如果直接 發布包含EJB的jar包,默認的jndi名稱為UserBean/remote。
運行上面的代碼後,將輸出如下的字符串:
TaokQpoNJQb02eafO/JgYw==