JPA 自動建表(3)- @Id,@GeneratedValue 與 @GenericGenerator 設置主鍵生成策略


@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 種主鍵生成策略之一,也可以是自定義的主鍵生成策略類的全名
 */


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM