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安裝目錄>serverdefaultdeploy目錄中建立一個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> </datasources> |
mysql-ds.xml文件用於配置mysql的數據源.實際上,該文件可以在<jboss安裝目錄>docsexamplesjca目錄中找到,讀者只需要將資料庫名、用戶名和密碼以及jndi名改成自己的就可以了.最后將修改後的mysql-ds.xml文件複製到deploy目錄中(必須叫這個文件名).
連接mysql資料庫需要一個jdbc驅動(jar文件),將該文件複製到<jboss安裝目錄>serverdefaultlib目錄中.
二、編寫實體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> |
其中<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== |
[火星人 ] eclipse JBoss 5 EJB3開發指南(6):編寫第一個實體Bean程序已經有656次圍觀