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的數據庫連接池
在\server\default\deploy目錄中建立一個MySQL-ds.XML文件,內容如下:
- < XML version="1.0" encoding="UTF-8"?>
- < datasources>
- < local-tx-datasource>
- < jndi-name>MyPIMjndi-name>
- < connection-url>jdbc:MySQL://localhost:3306/pimconnection-url>
- < driver-class>com.MySQL.jdbc.Driverdriver-class>
- < user-name>rootuser-name>
- < passWord>1234passWord>
- < exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorterexception-sorter-class-name>
- < metadata>
- < type-mapping>MySQLtype-mapping>
- < metadata>
- < local-tx-datasource>
- < datasources>
MySQL-ds.XML文件用於配置MySQL的數據源。實際上,該文件可以在\docs\examples\jca目錄中找到,讀者只需要將數據庫名、用戶名和密碼以及jndi名改成自己的就可以了。最後將修改後的MySQL-ds.XML文件復制到deploy目錄中(必須叫這個文件名)。
連接MySQL數據庫需要一個jdbc驅動(jar文件),將該文件復制到\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:/MyPIMjta-data-source>
- < propertIEs>
- < property name="hibernate.hbm2ddl.auto" value="none" />
- < property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
- < propertIEs>
- < persistence-unit>
- < persistence>
其中元素的值就是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文件中的元素的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==