JPA @Id 和 @GeneratedValue 注解详解

@Id: 

@Id 标注用于声明一个实体类的属性映射为数据库的主键列该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。 
@Id标注也可置于属性的getter方法之前。

@GeneratedValue: 
@GeneratedValue 用于标注主键的生成策略,通过strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer对应identity,MySQL 对应 auto increment。 

在javax.persistence.GenerationType中定义了以下几种可供选择的策略: 
–IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle 不支持这种方式; 
–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;

            }

    }

这种写法是错误的。

 

原文出处:

https://blog.csdn.net/qq_15037231/article/details/78284884

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值