開發工具:Eclipse Java EE IDE for WebDevelopers,JBoss 5.1.0.GA,Mysql 5.0.22
EJB(Enterprise JavaBean)有3種,Session Bean、Message Bean和Entity Bean。其中Session Bean又分為有狀態的會話Bean(Stateful Session Bean)和無狀態的會話Bean(Stateless Session Bean)。
這裡重點要說的是實體Bean。
實體Bean,看名字就可以猜到了這是一個ORM,對於已學過Hibernate的童鞋來說,接受起來實體Bean還是很輕鬆的,而且在事務方面,EJB3發布了JPA規範,也使得只要遵守JTA進行實體的編寫,那麼這些實體就具備了跨架構的可移植性。這個的實現,也是由於EJB3比EJB2的進步之處,採用了POJO(對EJB2隻是知道開發起來很麻煩,沒有詳細研究過)。
如果將Hibernate與EJB3.0進行對比,你會發現Session和EntityManager、SessionFactory和PersistenceContext有這異曲同工之妙,由於特殊原因,我先學習了EJB後學的Hibernate,由於EJB中的實體管理對象命名較形象,所以將Session往EntityManager上面靠,理解起來還是沒有太大困難的。
開發EJB和Hibernate還有所不同,Hibernate從某方面來說,它需要你從網上下載Hibernate的包,而EJB不一樣的是,它是由應用伺服器實現的,我這裡的做法是引入JBoss根目錄下client裡面所有的jar包,這樣就有了EJB開發的環境了。那麼需要怎樣做才能夠建立我的第一個EntityBean呢?
首先,拷貝資料庫驅動到JBoss_Home/server/default/lib下,然後拷貝docs/examples/jca/mysql-ds.xml到/servet/default/deploy目錄下,並修改資料庫使用者名稱及密碼。
點擊File->New->Ejb Project,填寫Project Name,這裡需要配置一下Configuration裡面的東西,如果不配置,你會發現你建立的EJB的註解都是無效的。點擊Modify進入ProjectFacets面板,Configuration選擇為custom,在Project Fecet選擇EjbModele,Java,JPA,版本號碼分別為3.0,1.6,2.0,如果不選JPA,你的EntityBean中的註解都是無效的。EAR
membership和Working sets暫時略過,點擊Nest,如果此時能Finish直接Finish即可,如果不能,那麼繼續Next,將Type選擇為Disable Library Configuration即可,然後Finish完成設定。
現在你看原始碼根目錄的META-INF下,會發現persistence.xml這個檔案,這個檔案你可以理解為就是Hibernate的核心設定檔,在這裡面進行配置:
mysql的資料庫配置和persistence配置如下:
persistence.xml<persistence-unit name="test" 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>mysql-ds.xml<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>admin</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>
現在,就可以開發實體Bean了,在項目中建立一個類,命名為User,有過Hibernate開發經驗的同學如果用過註解,那麼就很容易上手實體Bean的註解形式開發,因為他們都是採用了一套規範JPA。而且在開發實體Bean的時候,最好就是用JPA標準註解,盡量不用每個架構擴充的,因為經過這樣開發出來的實體Bean,複製到任何支援JPA的架構都是可以的。
和Hibernate的實體註解方式一樣,首先需要一個@Entity來註明此類為實體,然後需要表示Id,並且為Id的選擇建置原則:Person.java(未列出get、set方法)
public class Person implements Serializable {private static final long serialVersionUID = 1L;@Id@GeneratedValueprivate int id;private String name;}
這樣,一個實體Bean就開發完成了,那麼由於對資料庫配置了hibernate.hbm2ddl.auto為update,所以在EntityManager初始化的時候,就會自動對應表結構。
下面,就再寫一個Manager,對Person進行操作:
@Stateless@Remotepublic class PersonManagerBean implements PersonManager {@PersistenceContext(unitName="test")private EntityManager em;@Overridepublic void addPerson(String name) {Person person=new Person();person.setName(name);em.persist(person);}}
個人感覺EJB3.0中的命名要比Hibernate命名好一些,PersistenceContext就是SessionFactory,EntityManager就是Session,但Hibernate如果涉及到遠程,就歇菜了,而EJB是支援遠程調用的,並且EJB3.0發布為WebService也是極其容易。
對於二者的選擇,我想通過大家對它們的描述以及名字就可以知道了。Hibernate,輕量級ORM架構,EJB企業級JavaBean。
如果項目沒有涉及到分布式,遠程方法調用,那麼Hibernate用的還是不錯的
至此,第一個實體Bean的開發就結束了,個人感覺對於EJB3.0的理解,最好還是建立在Hibernate上,因為EJB3.0開始了廣泛的使用註解,使用註解開發簡單是毋庸置疑的,也省去了在兩個視窗之間來回切換,但是對於理解來說,還是全程使用xml檔案開發有助於理解。
最後再說一下註解和設定檔的選擇,註解的出現,絕對不是取代xml,但是由於註解的簡單,所以註解的應用廣泛化勢在必行。