Google Code Prettify

2016年4月19日 星期二

JPA: 新增含 SEQUENCE 欄位的資料

接繼上一篇 (Hibernate + Spring + JPA (configure)),之前只說明到怎麼查詢,這裡將說明新增資料的方法。假設有如下的 table:

最後一個欄位 ID 是序號,由 1 開始每次會自動加 1,因為我的資料庫是使用 Oracle,需要在 Oracle 新增一個 SEQUENCE,方法如下:
CREATE SEQUENCE  "STEVEN"."SQ_LOGINLOG"  MINVALUE 1 MAXVALUE 9999999999 INCREMENT BY 1 START WITH 1 NOCACHE ORDER NOCYCLE;
Java 的 Entity 如下宣告,注意兩件事:
  1. Oracle 自動產生序號時,GenerationType 要用 SEQUENCE (綠色)。
  2. sequenceName (紅色) 和資料庫中的 SEQUENCE 名稱要一樣,表示要使用剛剛建立的那一個 SEQUENCE。
@Entity
public class LoginLog implements Serializable {
    private String emNo;
    private Date loginTime;
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sq_loginlog")
    @SequenceGenerator(name="sq_loginlog", sequenceName="SQ_LOGINLOG", allocationSize=1)
    private Long id;
    
    public String getEmNo() {
        return emNo;
    }
    public void setEmNo(String emNo) {
        this.emNo = emNo;
    }
    public Date getLoginTime() {
        return loginTime;
    }
    public void setLoginTime(Date loginTime) {
        this.loginTime = loginTime;
    }
    
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
}
DAO 的寫法如下,注意以下幾點:
  1. EntityManager 在查詢時可以直接使用 spring 設定檔中的 bean,在 insert、update、delete 時不可以! 必須每次重新由 EntityManagerFactory 中建立一個新的。
  2. 建立 EntityManagerFactory 時,persistence 的名稱要用 persistence.xml 中的 persistence-unit 的名稱 (參看上一篇)。 
@Repository
public class LoginLogDaoImpl implements LoginLogDao {
    @Autowired
    private LoginLog dto;
    
    @Override
    public int save(String emNo, Date loginTime) {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnit");
        EntityManager entityManager = factory.createEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        
        transaction.begin();
        dto.setEmNo(emNo);
        dto.setLoginTime(loginTime);
        
        entityManager.persist(dto);
        transaction.commit();
        
        entityManager.close();
        
        return 1;
    }
}



沒有留言:

張貼留言