JPA @Id 和 @GeneratedValue 註解詳解
@Id:
@Id 標註用於宣告一個實體類的屬性對映為資料庫的主鍵列該屬性通常置於屬性宣告語句之前,可與宣告語句同行,也可寫在單獨行上。
@Id標註也可置於屬性的getter方法之前。
@GeneratedValue:
@GeneratedValue 用於標註主鍵的生成策略,通過strategy 屬性指定。預設情況下,JPA 自動選擇一個最適合底層資料庫的主鍵生成策略:SqlServer對應identity,MySQL 對應 auto increment。
在javax.persistence.GenerationType中定義了以下幾種可供選擇的策略:
–IDENTITY:採用資料庫ID自增長的方式來自增主鍵欄位
–AUTO: JPA自動選擇合適的策略,是預設選項;
–SEQUENCE:通過序列產生主鍵,通過@SequenceGenerator 註解指定序列名,MySql不支援這種方式
–TABLE:通過表產生主鍵,框架藉由表模擬序列產生主鍵,使用該策略可以使應用更易於資料庫移植。
推薦的兩種寫法:
屬性之上:
@Table(name="CUSTOMERS")
@Entity
public class Customer{
@GeneratedValue(strategy=GenerationType.AUTO)
@Id
private Integer id;
private String name;
private String email;
private int age;
public Integer getId(){
return id;
}
public void setId(Integer id){
this.id = id;
}
}
getter方法之上:
@Table(name="CUSTOMERS")
@Entity
public class Customer{
private Integer id;
private String name;
private String email;
private int age;
@GeneratedValue(strategy=GenerationType.AUTO)
@Id
public Integer getId(){
return id;
}
public void setId(Integer id){
this.id = id;
}
}
但是不能某個註解在屬性上,某個註解在getter上,將丟擲異常,對其他劇節也是如此。
@Table(name="CUSTOMERS")
@Entity
public class Customer{
@Id
private Integer id;
private String name;
private String email;
private int age;
@GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId(){
return id;
}
public void setId(Integer id){
this.id = id;
}
}
這種寫法是錯誤的。
原文出處: