首页 > 代码库 > EJB中数据库操作技术(JPA)

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对象的方法实现CRUP操作
 
   三、核心配置文件和代码
  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>

3.2  persistence.xml
//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="http://www.mamicode.com/update"/>
            <property name="hibernate.show_sql" value="http://www.mamicode.com/true"/>
            <property name="hibernate.format_sql" value="http://www.mamicode.com/true"/>
        </properties>
    </persistence-unit>
</persistence>

3.3 实体Bean
员工类Emp
//指定这是一个实体类,与之对应的表名,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方法-----

3.4会话Bean (DAO接口+DAO接口的实现类)
DAO接口
import java.util.List;
public interface DeptDAO {
public void add(Dept dept);
public Dept findById(int id);
public List findAll();
public List showAll();
}

DAO接口的实现类
//指定这是一个无会话的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();       
    }
}

3.5调用类
//用于调用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);
    }
}

EJB中数据库操作技术(JPA)