如果資料表的主鍵欄位(primary key column)是設定為自動遞增(auto increment),則在Java應用程式中對映的實體類別設定如下。
假設有個員工資料表EMPLOYEE
,其ID
欄位為主鍵欄位且自動遞增,則對映的實體類別Employee
的JPA設定如下。
@GeneratedValue
的生成策略要設為GenerationType.IDENTITY
(SQL Server, MySQL)。
如果是Oracle資料庫要設為GenerationType.SEQUENCE
。
Employee.java
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="EMPLOYEE")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="ID")
private Integer Id;
@Column(name="NAME")
private String name;
@Column(name="EMAIL")
private String email;
// getter and setter ...
}
下面是Hibernate的設定方式,把@GeneratedValue
的generator
指向@GenericGenerator
,strategy
設為increment
。
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="EMPLOYEE")
public class Employee {
@Id
@GeneratedValue(generator="idGenerator") // 參照下面@GenericGenerator的name
@GenericGenerator(name="idGenerator", strategy = "native")
@Column(name="ID")
private Integer Id;
@Column(name="NAME")
private String name;
@Column(name="EMAIL")
private String email;
// getter and setter ...
}
在程式中要INSERT一筆資料,則auto increment欄位的成員變數值設為null即可。
EntityManager em = getEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
em.persist(entity);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
em.close();
}
若不為null則會出現下面錯誤,這是因為Hibernate以為該實體已存在。
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: idv.matt.entity.Employee
如果本篇有幫助到您,幫忙點一下廣告支持,感恩。
參考:
沒有留言:
張貼留言