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 种主键生成策略之一,也可以是自定义的主键生成策略类的全名
 */
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值