首先,持久化Bean跟普通Java Bean无异,区别在于为了让Ejb容器可以识别,它们用Ejb的Annotation进行了标识。
Ø 一个实体类(即普通的POJO),并将其标识为@Entity。
Ø 实体类必须要有主键,一般用@Id将其标识。
Ø 在/META-INF/目录下,有persistence.xml文件,其主要作用是定义实体类映射的相关配置信息,比如指定数据源、都有哪些实体类、以及跟持久化相关的其它的一些属性。
拷贝数据库驱动到JBOSS_HOME/server/default/lib下,例如下图:
拷贝docs/examples/jca/mysql-ds.xml到目录下,并修改数据库用户名及密码(启动服务器会自动加载),如下图:
mysql-ds.xml的核心代码如下:
<?xml version="1.0" encoding="UTF-8"?> <datasources> <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>wangzhipeng</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>
选择Ejb3;选中“增加对Entity beans的支持”复选框
持久化单元的值在注入EntityManager对象时要使用,可以简单理解为对应一个数据库;JNDI Data Source:输入我们刚才配置的数据源名称,并加上前缀java:/;取消Specify JPADatasource details的复选框。
在创建完成之后,自动在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="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="create"/> <property name="show_sql" value="true" /> <property name="format_sql" value="true" /> </properties> </persistence-unit> </persistence>
部署EJB项目之后,即可以看到JBOSS自动导出了数据库表
import javax.ejb.Remote; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; @Stateless @Remote public class PersonManagerBean implements PersonManager { @PersistenceContext(unitName = "test") private EntityManager em; public void addPerson(String name) { Person person = new Person(); person.setId(1); person.setName("zhipeng"); em.persist(person); } }
与Hibernate的映射规则不太相同,默认会映射EntityBean的所有属性,如果某个属性不想被映射,需要加@Transient注解。
使用@Table和@Column注解,可将属性映射到特定的表和字段,默认的表名和字段名跟属性名一致,例如:
映射的注解可以放到两个位置(只能选择其中的一个):
Ø field-base(字段,实例变量)
Ø property-base(getters/setters所指定的属性)
如果选择,放到field上面,那么field即使没有getters/setters方法,也可以映射到数据库;如果放到property上面,那么即使只有getters/setters方法,没有对应的field,也可以映射到数据库。