开发工具: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>
和Hibernate的实体注解方式一样,首先需要一个@Entity来注明此类为实体,然后需要表示Id,并且为Id的选择生成策略:Person.java(未列出get、set方法)
public class Person implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue private int id; private String name; }
下面,就再写一个Manager,对Person进行操作:
@Stateless @Remote public class PersonManagerBean implements PersonManager { @PersistenceContext(unitName="test") private EntityManager em; @Override public void addPerson(String name) { Person person=new Person(); person.setName(name); em.persist(person); } }
对于二者的选择,我想通过大家对它们的描述以及名字就可以知道了。Hibernate,轻量级ORM框架,EJB企业级JavaBean。
如果项目没有涉及到分布式,远程方法调用,那么Hibernate用的还是不错的
至此,第一个实体Bean的开发就结束了,个人感觉对于EJB3.0的理解,最好还是建立在Hibernate上,因为EJB3.0开始了广泛的使用注解,使用注解开发简单是毋庸置疑的,也省去了在两个窗口之间来回切换,但是对于理解来说,还是全程使用xml文件开发有助于理解。
最后再说一下注解和配置文件的选择,注解的出现,绝对不是取代xml,但是由于注解的简单,所以注解的应用广泛化势在必行。