EJB中数据库操作技术(JPA)
一、导言---- 什么是JPA
Java Persistence API,规定使用注解或XML描述对象与数据表的映射,
实现将对象信息持久化到数据库。目前Hibernate\TopLink\OpenJPA等框架都支持JPA规范。
本例中,演示了通过JPA技术实现员工--部门多对一关系。
二、JPA开发流程
预先建立一个EJB工程
a. 配置数据源DataSource,修改*-ds.xml文件,并放入服务器的deploy目录
提示:在配置文件中指定了用哪个数据源连接数据库:
mysql-ds.xml中封装了数据源有关的jndi-name的值(如 jMySqlDS)必须与persistence.xml中jta-data-source相对应如(java:MySqlDS)。
b.创建工程,在src/META-INF下创建一个persistence.xml文件,引用java:DataSource名
提示:在配置文件中指定持久化用那个持久化单元做(可以有多个):
persistence.xml中的<persistence-unit name="MysqlPU">必须与DAOImpl中注释 @PersistenceContext(unitName="MysqlPU") 相对应.
c.编写EntityBean,实现序列化,setter/getter方法,equals/hashCode方法
d.使用注解,描述与数据的映射信息
e.编写SessionBean DAO组件操纵EntityBean
f.在SessionBean中使用EntityManager对象的方法实现CRUD操作
三、核心配置文件和代码
mysql-ds.xml-----persistence.xml-------实体Bean(Emp员工类+Dept部门类)------会话 Bean(接口+时间类)------测试类
3.1 mysql-ds.xml
//配置数据源,包括URL,密码,用户名等
3.2 persistence.xml
//EJB配置文件,指定采用的数据源以及配置hibernate相应信息
3.3 实体Bean 员工类Emp
3.4会话Bean (DAO接口+DAO接口的实现类) DAO接口
DAO接口的实现类
3.5调用类
Java Persistence API,规定使用注解或XML描述对象与数据表的映射,
实现将对象信息持久化到数据库。目前Hibernate\TopLink\OpenJPA等框架都支持JPA规范。
本例中,演示了通过JPA技术实现员工--部门多对一关系。
二、JPA开发流程
预先建立一个EJB工程
a. 配置数据源DataSource,修改*-ds.xml文件,并放入服务器的deploy目录
提示:在配置文件中指定了用哪个数据源连接数据库:
mysql-ds.xml中封装了数据源有关的jndi-name的值(如 jMySqlDS)必须与persistence.xml中jta-data-source相对应如(java:MySqlDS)。
b.创建工程,在src/META-INF下创建一个persistence.xml文件,引用java:DataSource名
提示:在配置文件中指定持久化用那个持久化单元做(可以有多个):
persistence.xml中的<persistence-unit name="MysqlPU">必须与DAOImpl中注释 @PersistenceContext(unitName="MysqlPU") 相对应.
c.编写EntityBean,实现序列化,setter/getter方法,equals/hashCode方法
d.使用注解,描述与数据的映射信息
e.编写SessionBean DAO组件操纵EntityBean
f.在SessionBean中使用EntityManager对象的方法实现CRUD操作
三、核心配置文件和代码
mysql-ds.xml-----persistence.xml-------实体Bean(Emp员工类+Dept部门类)------会话 Bean(接口+时间类)------测试类
3.1 mysql-ds.xml
//配置数据源,包括URL,密码,用户名等
<?xml version="1.0" encoding="UTF-8"?> <!-- See http://www.jboss.org/community/wiki/Multiple1PC for information about local-tx-datasource --> <!-- $Id: mysql-ds.xml 88948 2009-05-15 14:09:08Z jesper.pedersen $ --> <!-- Datasource config for MySQL using 3.0.9 available from: http://www.mysql.com/downloads/api-jdbc-stable.html --> <datasources> <local-tx-datasource> <jndi-name>MySqlDS</jndi-name> <connection-url>jdbc:mysql://localhost:3306/ejb</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>root</user-name> <password>sd100301</password> <max-pool-size>20</max-pool-size> <min-pool-size>1</min-pool-size> <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> <!-- should only be used on drivers after 3.22.1 with "ping" support <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name> --> <!-- sql to call when connection is created <new-connection-sql>some arbitrary sql</new-connection-sql> --> <!-- sql to call on an existing pooled connection when it is obtained from pool - MySQLValidConnectionChecker is preferred for newer drivers <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql> --> <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) --> <metadata> <type-mapping>mySQL</type-mapping> </metadata> </local-tx-datasource> </datasources>
//EJB配置文件,指定采用的数据源以及配置hibernate相应信息
<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" 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 "> <persistence-unit name="MysqlUnit" transaction-type="JTA"> <jta-data-source>java:MySqlDS</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="update"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> </properties> </persistence-unit> </persistence>
//指定这是一个实体类,与之对应的表名,ID是哪个,各个属性对应的列名是哪个 @Entity @Table(name = "emp") public class Emp implements Serializable { @Id @GeneratedValue @Column(name = "id") private int id; @Column(name="ename",length=20,nullable=false) private String ename; @ManyToOne() @JoinColumn(name="dept_id") private Dept dept; public Emp() { } public Emp(int id, String ename) { super(); this.id = id; this.ename = ename; } //-------在此处添加各个属性的getter&setter方法----- 部门类Emp //指定这是一个实体类,与之对应的表名,ID是哪个,各个属性对应的列名是哪个 @Entity @Table(name="dept") public class Dept implements Serializable { @Id @GeneratedValue @Column(name="id") private int id; @Column(name="dname",nullable=false,length=20) private String dname; @OneToMany(mappedBy="dept") private Set<Emp> emps=new HashSet<Emp>(); public Dept() { } public Dept( String dname) { super(); this.dname = dname; } //-------在此处添加各个属性的getter&setter方法-----
import java.util.List; public interface DeptDAO { public void add(Dept dept); public Dept findById(int id); public List findAll(); public List showAll(); }
//指定这是一个无会话的SessionBean, @Stateless //声明该SessionBean的远程业务接口为DeptDAO @Remote(DeptDAO.class) public class DeptDAOImpl implements DeptDAO { //指定EntityManager所采用的持久化单元 @PersistenceContext(unitName="MysqlPU") //EntityManager 封装了添加、查找、更新等各种数据库操作方法。 private EntityManager em; public void add(Dept dept) { em.persist(dept); } public List findAll() { String jpql="select d from dept d"; return em.createQuery(jpql).getResultList(); } public Dept findById(int id) { Dept dept=em.find(Dept.class, id); return dept; } public List showAll() { String jpql="select d.id,d.dname,count(e)" + " from dept d left join d.emps e"; return em.createQuery(jpql).getResultList(); } }
//用于调用EJB中的SessionBean,来实现数据库操作 import java.util.*; import java.util.Set; import javax.naming.*; import jpa.*; public class TestDeptDAO { public static void main(String[] args) throws Exception { testSave(); } public static void testSave() throws Exception { //黑体部分:先设置环境参数,再用环境参数构造出上下文的一个对象。 //这些代码是基本固定的。在各种调用中都是必须的。 Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); env.put(Context.PROVIDER_URL, "jnp://localhost:1099"); InitialContext context = new InitialContext(env); //通过context的lookup方法得到实现类的对象 DeptDAO deptDAO = (DeptDAO) context.lookup("DeptDAOImpl/remote"); //简历新部门--新员工集合--新员工--设置各种关系--保存新部分(本应级联保存所有新员工信息) Dept dept = new Dept(); dept.setDname("sale"); Set<Emp> emps = new HashSet<Emp>(); Emp emp1 = new Emp(); emp1.setEname("徐亮"); emp1.setDept(dept); emps.add(emp1); Emp emp2 = new Emp(); emp2.setEname("小王"); emp2.setDept(dept); emps.add(emp2); Emp emp3 = new Emp(); emp3.setEname("小华"); emp3.setDept(dept); emps.add(emp3); dept.setEmps(emps); deptDAO.add(dept); } }
来源:
http://blog.sina.com.cn/s/blog_4f9ce8f30100kawm.html