JPA @Id 和 @GeneratedValue 注解详解

来源:互联网 发布:杭州 大数据公司 编辑:程序博客网 时间:2024/05/20 16:14

@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")@Entitypublic 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;    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

getter方法之上:

@Table(name="CUSTOMERS")@Entitypublic 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;    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

但是不能某个注解在属性之上,某个注解在getter之上,将抛出异常,对其他注解也相同

@Table(name="CUSTOMERS")@Entitypublic 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;    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

上面的写法是错误的

原创粉丝点击