您的位置:首页 > 产品设计 > UI/UE

4. JPA @Id 和 @GeneratedValue 注解详解

2016-03-03 14:13 639 查看
@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;
}


上面的写法是错误的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jpa