JPA
全称,Java Persistence API,Java持久化API
JPA是一套持久化标准,相当于JDBC标准,针对于此标准的实现目前有OpenJAP,TOPLINK,Hibernate等。
OpenJPA
是apache基金会针对于JPA2 标准开发的一套持久化实现类库。
下载地址:http://openjpa.apache.org/ http://openjpa.apache.org/downloads.html
JPA书籍
下载地址:http://download.csdn.net/detail/changsheng1453052832/5859125
JPA 例子
下载地址:http://download.csdn.net/detail/changsheng1453052832/5859153
JPA文档chm格式
下载地址:http://download.csdn.net/detail/changsheng1453052832/5859559
例子讲解:
例子代码下载完成之后,导入工程,可以看到如下的目录结构
其中persistence.xml是JPA配置文件。内容如下:
<?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" version="2.0"> <!-- 持久化单元 --> <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL"> <!-- OpenJPA 持久化实现 --> <provider> org.apache.openjpa.persistence.PersistenceProviderImpl </provider> <!-- 指定哪些实体需要持久化 --> <class>examples.model.Employee</class> <!-- 配置数据库连接信息 --> <properties> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="changsheng" /> <!-- 可以自动生成数据库表 --> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> </properties> </persistence-unit> </persistence>
获取EntityManager方法:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("EmployeeService"); EntityManager em = emf.createEntityManager();
其中“EmployeeService”为persistence.xml中持久化单元中的名字。
在获取了EntityManager之后可以对你进行注册的实体进行操作。如Employee类。
目前有一个EmployeeService对实体Employee进行操作,增删改查。将EntityManager注入进去。通过接口中的方法对实体进行操作。
主要的方法有persist,find,remove,createQuery
package examples.model; import java.util.Collection; import javax.persistence.EntityManager; import javax.persistence.Query; public class EmployeeService { protected EntityManager em; public EmployeeService(EntityManager em) { this.em = em; } public Employee createEmployee(int id, String name, long salary) { Employee emp = new Employee(id); emp.setName(name); emp.setSalary(salary); em.persist(emp); return emp; } public void removeEmployee(int id) { Employee emp = findEmployee(id); if (emp != null) { em.remove(emp); } } public Employee raiseEmployeeSalary(int id, long raise) { Employee emp = em.find(Employee.class, id); if (emp != null) { emp.setSalary(emp.getSalary() + raise); } return emp; } public Employee findEmployee(int id) { return em.find(Employee.class, id); } @SuppressWarnings("unchecked") public Collection<Employee> findAllEmployees() { Query query = em.createQuery("SELECT e FROM Employee e"); return (Collection<Employee>) query.getResultList(); } }
Employee领域对象
package examples.model; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Employee { @Id private int id; private String name; private long salary; public Employee() {} public Employee(int id) { this.id = id; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getSalary() { return salary; } public void setSalary(long salary) { this.salary = salary; } public String toString() { return "Employee id: " + getId() + " name: " + getName() + " salary: " + getSalary(); } }
在employee领域对象中,我们定义了ID,Name ,Salary(薪水)。当然每个员工需要有一个ID来进行标示,不可能重复。
其中@Entity注解,指定Employee类是需要持久化的。
@Id指定id字段作为实体的标示符。
事务
事务可以通过EntityManager.getTransaction()
em.getTransaction().begin(); Employee emp = service.createEmployee(id, name, salary); em.getTransaction().commit();
以上主要是和JPA相关的简单介绍,有个基本的认识就可以了,下载例子代码,运行下,看看具体的代码细节。