ORM產品琳瑯滿目,卻沒有一樣有上手在用,導致初學JPA(Java Persistence API)浪費了一點時間。
目前比較有名的ORM是Hibernate, JDO, TopLink, iBATIS等,其中Hibernate作者被Sun挖去開發EJB3後,再EJB3提煉出抽象介面的API-即JPA作為ORM產品的standard。
也因此我犯錯的是,找到API的jar卻沒也把Provider的jar給import進來。
根據Apress出版的Pro EJB 3 Java Persistence API的sample,甚至也不用到deploy Web/AP Server進行測試,要注意以下:
1.要有META-INF目錄,需在classes目錄下,即常與\com, \org同一層,目錄下放persistence.xml,該檔目的是定義使用哪一個ORM產品,以下是TopLink的設定:(若是Hibernate,properties標籤下的tag也都不太一樣了)
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL">
<class>examples.model.Employee</class>
<properties>
<property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/quickstart"/>
<property name="toplink.jdbc.user" value="root"/>
<property name="toplink.jdbc.password" value="systex"/>
<!-- enable this property to see SQL and other logging -->
<!-- property name="toplink.logging.level" value="FINE"/ -->
</properties>
</persistence-unit>
</persistence>
<persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL">
<class>examples.model.Employee</class>
<properties>
<property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/quickstart"/>
<property name="toplink.jdbc.user" value="root"/>
<property name="toplink.jdbc.password" value="systex"/>
<!-- enable this property to see SQL and other logging -->
<!-- property name="toplink.logging.level" value="FINE"/ -->
</properties>
</persistence-unit>
</persistence>
2.jar檔至少要三種:JPA jar, JPA implement jar與JDBC Driver的jar
(1)JPA jar:一份就夠了,如TopLink的是toplink-essentials-agent.jar,Hibernate.org的是hibernate-entitymanager.jar,JBoss的是ejb3-persistence.jar
(2)JPA implement jar:端看persistence.xml是配置哪一個ORM產品,如上述的Top-Link,是使用toplink-essentials.jar。
(3)JDBC Driver:上述使用MySQL,是故為mysql-connector-java-3.1.7-bin.jar;若是Oracle則需ojdbc14.jar
以下是JPA的Sample:
(Employee.java)
package examples.model;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Id;
@Entity
public class Employee {
@Id
private int id;
private String name;
private long salary;
public class Employee {
@Id
private int id;
private String name;
private long salary;
public Employee() {}
public Employee(int id) {
this.id = id;
}
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;
}
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;
}
return salary;
}
public void setSalary(long salary) {
this.salary = salary;
}
public String toString() {
return "Employee id: " + getId() + " name: " + getName() + " salary: " + getSalary();
}
}
this.salary = salary;
}
public String toString() {
return "Employee id: " + getId() + " name: " + getName() + " salary: " + getSalary();
}
}
(EmployeeService.java)
package examples.model;
import java.util.Collection;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.Query;
public class EmployeeService {
protected EntityManager em;
protected EntityManager em;
public EmployeeService(EntityManager em) {
this.em = 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;
}
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);
}
}
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;
}
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);
}
return em.find(Employee.class, id);
}
public Collection<Employee> findAllEmployees() {
Query query = em.createQuery("SELECT e FROM Employee e");
return (Collection<Employee>) query.getResultList();
}
}
Query query = em.createQuery("SELECT e FROM Employee e");
return (Collection<Employee>) query.getResultList();
}
}
(EmployeeTest.java)
public class EmployeeTest {
public static void main(String[] args) {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("EmployeeService");
EntityManager em = emf.createEntityManager();
EmployeeService service = new EmployeeService(em);
// create and persist an employee
em.getTransaction().begin();
Employee emp = service.createEmployee(158, "John Doe", 45000);
em.getTransaction().commit();
System.out.println("Persisted " + emp);
// find a specific employee
emp = service.findEmployee(158);
System.out.println("Found " + emp);
// find all employees
Collection<Employee> emps = service.findAllEmployees();
for (Employee e : emps)
System.out.println("Found Employee: " + e);
// update the employee
em.getTransaction().begin();
emp = service.raiseEmployeeSalary(158, 1000);
em.getTransaction().commit();
System.out.println("Updated " + emp);
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("EmployeeService");
EntityManager em = emf.createEntityManager();
EmployeeService service = new EmployeeService(em);
// create and persist an employee
em.getTransaction().begin();
Employee emp = service.createEmployee(158, "John Doe", 45000);
em.getTransaction().commit();
System.out.println("Persisted " + emp);
// find a specific employee
emp = service.findEmployee(158);
System.out.println("Found " + emp);
// find all employees
Collection<Employee> emps = service.findAllEmployees();
for (Employee e : emps)
System.out.println("Found Employee: " + e);
// update the employee
em.getTransaction().begin();
emp = service.raiseEmployeeSalary(158, 1000);
em.getTransaction().commit();
System.out.println("Updated " + emp);
// remove an employee
em.getTransaction().begin();
service.removeEmployee(158);
em.getTransaction().commit();
System.out.println("Removed Employee 158");
// close the EM and EMF when done
em.close();
emf.close();
}
}
em.getTransaction().begin();
service.removeEmployee(158);
em.getTransaction().commit();
System.out.println("Removed Employee 158");
// close the EM and EMF when done
em.close();
emf.close();
}
}
全站熱搜