2014年10月19日 星期日

【筆記】使用JPA API中的@GeneratedValue來建立主鍵,以@TableGenerator為例

之前在【筆記】一個在Java SE中運行的簡單JPA程式有介紹如何在Java SE環境建立一個簡單的JPA應用程式。

在該範例中,我是手動幫Employee設定id,但在JPA中,可以使用GeneratedValue這個Annotation來產生主鍵,使用的策略(strategy)有四種:
public enum GenerationType { 
 TABLE, 
 SEQUENCE, 
 IDENTITY, 
 AUTO 
};
詳細說明,可以參考這裡

這裡要使用strategy=GenerationType.TABLE,使用一個TableGenerator來產生主鍵。

先在資料庫中建立一個資料表,名為ID_GEN
create table ID_GEN(GEN_KEY varchar(100), GEN_VALUE BIGINT, primary key(GEN_KEY))
再來新一筆資料:
insert into ID_GEN (GEN_KEY, GEN_VALUE) values('EMP_ID', 0)
把先前Employee這個Entity的程式碼改成:
package examples.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.TableGenerator;

@TableGenerator(
  table="ID_GEN",
  pkColumnName="GEN_KEY",
  valueColumnName="GEN_VALUE",
  pkColumnValue="EMP_ID",
  allocationSize=1, 
  name = "empGen"
)
@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy=GenerationType.TABLE, generator="empGen")
    private int id;
    private String name;
    private long salary;
    
 public Employee() {}

    public int getId() {
        return 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中的createEmployee方法,改成不用手動設定id
public Employee createEmployee(int id, String name, long salary) {
        Employee emp = new Employee();
        emp.setName(name);
        emp.setSalary(salary);
        
        em.persist(emp);
        return emp;
    }
然後把執行的主程式改成:
package examples.client;

import java.util.Collection;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import examples.model.Employee;
import examples.model.EmployeeService;

public class EmployeeMain {
    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("Bio Young", 90000);
        em.getTransaction().commit();
        System.out.println("Persisted " + emp);
        
        // find all employees
        Collection<Employee> emps = service.findAllEmployees();
        for (Employee e : emps)
        {
         System.out.println("Found Employee: " + e);
        }
            
        em.close();
        emf.close();
    }
}
最後,執行主程式看結果。

沒有留言: