JPA的基本注解主要包括@Entity、@Table、@Id、@GeneratedValue、@Basic、@Column、@Transient、@Temporal和@TableGenerator等。
其中,JPA基本注解的具体实现代码下载地址:http://download.csdn.net/download/bingbeichen/9805737。
1. @Entity
标注位置:实体类声明语句之前;
主要作用:标注该Java类为实体类,且将其映射到指定的数据库表。
// 例:默认将实体类Customer映射到数据库的CUSTOMER表上
@Entity
public class Customer { //... }
2. @Table
标注位置:实体类声明语句之前,与@Entity注释并列使用;
主要作用:标注当前实体类映射到数据库中的数据表名,当实体类与数据表名不同时使用。
// 例:将实体类Customer映射到数据库的CUSTOMERS表上
@Table(name="CUSTOMERS")
@Entity
public class Customer { //... }
3. @Id
标注位置:实体类的属性声明语句之前,或属性的getter()方法之前;
主要作用:指定该实体类的当前属性映射到数据表的主键列。
// 例:将该实体类id属性映射到数据表的主键列
@Id
public Integer getId() {
return id;
}
4. @GeneratedValue
标注位置:与@Id注释配合使用;
主要作用:通过其strategy属性指定数据表主键的生成策略。默认情况下,JPA自动选择最适合底层数据库的主键生成策略,即SqlServer对应identity,而MySQL对应auto increment。
其中,在javax.persistence.GenerationType中定义了如下几种可供选择的主键生成策略:
主键生成策略 | 具体描述 |
---|---|
IDENTITY | 采用数据库ID自增长的方式来生成主键,但Oracle数据库不支持该方式 |
AUTO | 默认选项,JPA自动选择合适的主键生成策略 |
SEQUENCE | 采用序列生成主键,通过@SequenceGenerator注解指定序列名,但MySQL数据库不支持该方式 |
TABLE | 采用外部表生成主键,框架借由表模拟序列产生主键,该策略可使应用程序更易于数据库移植 |
// 例:采用外部表的方式来生成主键
@TableGenerator(name="ID_GENERATOR",
table="jpa_id_generators",
pkColumnName="PK_NAME",
pkColumnValue="ORDER_ID",
valueColumnName="PK_VALUE",
allocationSize=1)
@GeneratedValue(strategy=GenerationType.TABLE, generator="ID_GENERATOR")
// @GeneratedValue(strategy=GenerationType.AUTO)
@Id
public Integer getId() {
return id;
}
5. @Basic
标注位置:实体类的属性声明语句之前,或属性的getter()方法之前;
主要作用:标注将实体类的当前属性映射到数据库表的字段,对于没有任何标注的getter()方法,默认即为@Basic,其具有如下属性:
属性 | 说明 |
---|---|
fetch | 表示该属性的读取策略,取值为EAGER(主支抓取,默认值)和LAZY(延迟加载) |
optional | 表示该属性是否允许为null,默认为true |
// 例:将该实体类email属性映射到数据库表的email字段
public String getEmail() {
return email;
}
6. @Column
标注位置:实体类的属性声明语句之前,或属性的getter()方法之前;
主要作用:标注实体类的当前属性映射到数据库表的字段名,当属性名与数据表字段名不一致时使用。
标注将实体类的当前属性映射到数据库表的字段,对于没有任何标注的getter()方法,默认即为@Basic,其具有如下属性:
属性 | 说明 |
---|---|
name | 设置映射到数据库表的字段名 |
unique | 设置映射到数据库表的字段具有唯一约束 |
nullable | 设置映射到数据库表的字段是否为空 |
length | 设置映射到数据库表的字段长度 |
columnDefinition | 设置映射到数据库表的字段的实际类型,如将String类型属性映射为BLOB或TEXT类型字段 |
// 例:将该实体类name属性映射到数据库表的LAST_NAME字段
@Column(name="LAST_NAME")
public String getName() {
return name;
}
7. @Transient
标注位置:实体类的属性声明语句之前,或属性的getter()方法之前;
主要作用:标注实体类的当前属性不进行数据表字段的映射,ORM框架将忽略此映射,如实体类的getInfo()方法通常不需要映射到数据表的字段上。
8. @Temporal
标注位置:实体类的属性声明语句之前,或属性的getter()方法之前;
主要作用:标注实体类中Date类型(Java核心API中未定义Date类型的精度)的属性映射到数据表字段的具体精度(数据库中Date类型的数据有DATE、TIME和TIMESTAMP三种精度)。
// 例:将该实体类Date类型的createTime属性映射到数据库表TIMESTAMP精度的CREATE_TIME字段
@Temporal(TemporalType.TIMESTAMP)
@Column(name="CREATE_TIME")
public Date getCreateTime() {
return createTime;
}
// 例:将该实体类Date类型的birth属性映射到数据库表DATE精度的BIRTH字段
@Temporal(TemporalType.DATE)
public Date getBirth() {
return birth;
}
9. @TableGenerator:使用外部表生成主键
标注位置:实体类的属性声明语句之前,或属性的getter()方法之前;
主要作用:将当前主键的值单独保存到外部数据表中,每次从该外部表中查询获取其当前数据表的主键值;
对比优势:该主键生成策略可以适用于任何数据库,故更加易于数据库的移植。
@TableGenerator主要具有如下属性:
属性 | 说明 |
---|---|
name | 表示该主键生成策略的名称,其被引用在@GeneratedValue中设置的generator值中 |
table | 表示表生成策略所持久化的表名 |
pkColumnName | 表示在持久化表中,该主键生成策略所对应键值的名称 |
valueColumnName | 表示在持久化表中,该主键当前所生成的值,其会随着每次创建而累加 |
pkColumnValue | 表示在持久化表中,该生成策略所对应的主键 |
allocationSize | 表示每次主键值增加的大小,默认值为50 |
// 例:采用外部表的方式来生成主键
@TableGenerator(name="ID_GENERATOR",
table="jpa_id_generators",
pkColumnName="PK_NAME",
pkColumnValue="CUSTOMER_ID",
valueColumnName="PK_VALUE",
allocationSize=1)
@GeneratedValue(strategy=GenerationType.TABLE, generator="ID_GENERATOR")
// @GeneratedValue(strategy=GenerationType.AUTO)
@Id
public Integer getId() {
return id;
}