首页 > 代码库 > 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)