最後一個欄位 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 如下宣告,注意兩件事:
- Oracle 自動產生序號時,GenerationType 要用 SEQUENCE (綠色)。
- 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 的寫法如下,注意以下幾點:
- EntityManager 在查詢時可以直接使用 spring 設定檔中的 bean,在 insert、update、delete 時不可以! 必須每次重新由 EntityManagerFactory 中建立一個新的。
- 建立 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;
}
}
沒有留言:
張貼留言