@Id,@GeneratedValue 一起使用,設置主鍵生成策略為: 主鍵自增
注意:適用於MySql等具備主鍵自增功能的數據庫,因為底層就是借用了MySql的主鍵自增功能1 @Entity 2 public class TblTest { 3 4 @Id 5 @GeneratedValue(strategy = GenerationType.IDENTITY) // 設置主鍵生成策略為:主鍵自增長,適用於MySQL等部分數據庫 6 private Integer id; 7 8 public Integer getId() { return id; } 9 public void setId(Integer id) { this.id = id; } 10 public TblTest() { } 11 }【建表語句】
CREATE TABLE `tbl_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) )
@Id @GeneratedValue @GenericGenerator 一起使用,設置主鍵生成策略為: uuid
注意:該策略是Hibernate提供的1 @Entity 2 public class TblTest { 3 4 @Id 5 @GeneratedValue(generator = "myUuidGenerator") // 給主鍵生成策略起個名字,隨意起名 6 @GenericGenerator(name = "myUuidGenerator", strategy = "uuid") // 設置主鍵生成策略為:uuid , 是 Hibernate 提供的 7 private String id; 8 9 public String getId() { return id; } 10 public void setId(String id) { this.id = id; } 11 public TblTest() { } 12 }【建表語句】
CREATE TABLE `tbl_test` ( `id` varchar(255) NOT NULL, PRIMARY KEY (`id`) )【測試:新增一條記錄】save( new TblTest() );![]()
@Id @GeneratedValue @GenericGenerator 一起使用,設置主鍵生成策略為: 自定義策略
1 import org.hibernate.annotations.GenericGenerator; 2 import org.hibernate.annotations.Parameter; 3 import javax.persistence.*; 4 5 @Entity 6 public class TblTest { 7 8 @Id 9 @GeneratedValue(generator = "myIdGenerator") // 給主鍵生成策略起個名字,隨意起名 10 @GenericGenerator( 11 name = "myIdGenerator", // 策略名稱,必須和上面的名稱一致 12 strategy = "com.abdusalam.test.MyIdGenerator", // 自定義的主鍵生成類全名 13 parameters = {@Parameter(name="prefix", value="tblId_")} // 傳遞參數【 參數名:prefix 參數值:tblId_ 】【不需要傳遞參數時,可以不用 parameters 】 14 ) 15 private String id; 16 17 public String getId() { return id; } 18 public void setId(String id) { this.id = id; } 19 public TblTest() { } 20 }import org.hibernate.id.Configurable; import org.hibernate.id.IdentifierGenerator; // 自定義id生成策略的類 // IdentifierGenerator 接口提供 generate 方法:用來生成主鍵 // Configurable 接口提供 configure 方法:用來接收參數 public class MyIdGenerator implements Configurable,IdentifierGenerator { public String pre; @Override public void configure(Type type, Properties properties, ServiceRegistry serviceRegistry) throws MappingException { this.pre = properties.getProperty("prefix"); } @Override public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException { int random = new Random().nextInt(9000) + 1000; // 四位隨機數: 5826 String timestamp = (System.currentTimeMillis()+"").substring(9); // 時間戳后四位: 7181 String id = this.pre + timestamp + random; // 最終生成的Id值:前綴_71815826 return id; } }【建表語句】 CREATE TABLE `tbl_test` ( `id` varchar(255) NOT NULL, PRIMARY KEY (`id`) )【測試:新增一條記錄】save( new TblTest() );
重點:多個注解配合使用
以上代碼看不懂?就看以下解釋說明
/** * @javax.persistence.Id 聲明該屬性為主鍵,一個實體只能有一個屬性被映射為主鍵 * * * @javax.persistence.GeneratedValue(strategy=GenerationType.AUTO,generator="xxx") 主鍵是自動生成策略,一般該注釋和 @Id 一起使用 * strategy 四種取值 * GenerationType.AUTO 【默認值】生成方式取決於底層數據庫 * GenerationType.IDENTITY 主鍵自增長,適用於MySQL等部分數據庫 * GenerationType.TABLE 使用一個特定的數據庫表格來保存主鍵 * GenerationType.SEQUENCE 在某些數據庫中,不支持主鍵自增長, * 比如Oracle,Oracle 提供了一種叫做"序列(sequence)"的機制生成主鍵, * 要與@SequenceGenerator一起使用 * generator * 主鍵生成器的名字,與 @GenericGenerator 結合使用 * * * @org.hibernate.annotations.GenericGenerator 【Hibernate 所提供的】 ,與 @GeneratedValue 一起使用 * 舉例 * @Id * @GeneratedValue(generator = "myGenerator") * @GenericGenerator(name="myGenerator",strategy = "uuid") // 這里的 uuid 是 Hibernate 所提供的主鍵生成策略 * private Integer Id; * 講解 * @GeneratedValue 注解中的 generator 屬性要與 @GenericGenerator 注解中 name 屬性一致 * strategy 用來指定主鍵生成策略 * 策略名稱可以是 Hibernate 提供的 13 種主鍵生成策略之一,也可以是自定義的主鍵生成策略類的全名 */