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>
 
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;
@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();
    }
}
(EmployeeService.java)
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);
    }
    public Collection<Employee> findAllEmployees() {
        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);
        // 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();
    }
}
 
arrow
arrow
    全站熱搜

    Jemmy 發表在 痞客邦 留言(0) 人氣()