JPA+Hibernate中常用的注解
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体[对象持久化](https://baike.baidu.com/item/对象持久化/7316192)到数据库中。
Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。
JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致。总的来说,JPA包括以下3方面的技术:
ORM映射元数据
JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中
API
用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
查询语言
这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
其上数据,引自网络: https://baike.baidu.com/item/JPA/5660672?fr=aladdin
常用注解:
1. @Entity
使用jpa定义一个持久化类是,使用@Entity注解来修饰持久化类,直接写在类名上方即可,每一个持久化类都应实现Serializable接口
示例:
@Entity
public class TestEntity implements Serializable{....}
2. @ID
定义某一字段为主键ID,示例:
@Id
private String uuid;
一般情况下,@ID注解不单独使用,而是配合@GeneratedValue使用,示例
@GeneratedValue
@Id
private String uuid;
3. @GenericGenerator 自定义生成主键,主要属性值有
3.1. name属性指定生成器名称。
3.2.strategy属性指定具体生成器的类名。
3.3.parameters得到strategy指定的具体生成器所用到的参数。
示例:
@Target({PACKAGE, TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface GenericGenerator {
String name();
String strategy();
Parameter[] parameters() default {};
}
@GenericGenerator应用时与@GeneratedValue 同时使用,示例:
@GeneratedValue(generator="testXXX")
@GenericGenerator(name="testXXX",strategy="testABC")
@Id
private Integer id;
注意:其中GeneratedValue的 generator 属性值使用的时 GenericGenerator的name 的属性值
4. @Column 是属性或方法级别的注解,用于指定持久化属性映射到数据库表的列。如果没有指定列注释,则使用其默认值。
参数 | 类型 | 描述 |
---|---|---|
name | String | 列的名称,默认为属性的名称(Hibernate 映射列时,若遇到驼峰拼写,会自动添加 _ 连接并将大写字母改成小写)。 |
unique | boolean | 列的值是否是唯一的。这是 @UniqueConstraint 注解的一个快捷方式, 实质上是在声明唯一约束。默认值为 false。 |
nullable | boolean | 列的值是否允许为 null。默认为 true。 |
insertable | boolean | 列是否包含在 INSERT 语句中,默认为 true。 |
updatable | boolean | 列是否包含在 UPDATE 语句中,默认为 true。 |
columnDefinition | String | 生成列的 DDL 时使用的 SQL 片段。默认使用推断的类型来生成 SQL 片段以创建此列。 |
table | String | 当前列所属的表的名称。 |
length | int | 列的长度,仅对字符串类型的列生效。默认为255。 |
precision | int | 列的精度,仅对十进制数值有效,表示有效数值的总位数。默认为0。 |
scale | int | 列的精度,仅对十进制数值有效,表示小数位的总位数。默认为0。 |
示例代码:
@Entity(name = "users")
public class Users implements Serializable {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false, length = 32)
private String username;
@Column(length = 128)
private String mail;
@Column(columnDefinition = "char(11) NOT NULL")
private String phone;
@Column(precision = 5, scale = 2)
private BigDecimal bigDecimal;
@Column(precision = 5, scale = 2)
private double udouble;
// getters and setters
}
其上生成的MySQL语句:
CREATE TABLE `person` (
`id` bigint( 20) NOT NULL AUTO_INCREMENT,
`udouble` double NOT NULL,
`mail` varchar( 128) DEFAULT NULL,
`username` varchar( 32) NOT NULL,
`phone` char( 11) NOT NULL,
`bigDecimal` decimal( 5, 2) DEFAULT NULL,
PRIMARY KEY ( `id`)
) ENGINE= InnoDB DEFAULT CHARSET=utf8;
从生成的sql语句中可以看出,bigDecimal 字段的精度控制生效了,但对于double类型的 udouble 字段的精度控制没有生效,让之生效,可以将代码修改为:
@Column(columnDefinition = "double(5, 2)")
private double udouble;
再次运行,MySQL代码如下:
CREATE TABLE `person` (
`id` bigint( 20) NOT NULL AUTO_INCREMENT,
`udouble` double( 5, 2) DEFAULT NULL,
`mail` varchar( 128) DEFAULT NULL,
`username` varchar( 32) NOT NULL,
`phone` char( 11) NOT NULL,
`bigDecimal` decimal( 5, 2) DEFAULT NULL,
PRIMARY KEY ( `id`)
) ENGINE= InnoDB DEFAULT CHARSET=utf8;
5. @Table - 映射表名
参数 | 类型 | 描述 |
---|---|---|
name | String | 表的名称,默认为实体名称(参考 @Entity 注解的 name 参数说明),因此如果实体名称与映射的表名称一致时,@Table 注解常常可以省略。 |
catalog | String | 默认为数据库系统缺省的 catalog。 |
schema | String | 默认为用户缺省的 schema。 |
uniqueConstraints | UniqueConstraint[] | 表的唯一约束(除了由 @Column 和 @JoinColumn 注解指定的约束以及主键的约束之外的约束),通过使用 @UniqueConstraint 注解来声明,仅在允许自动更新数据库表结构的场景中起到作用,默认没有其他额外的约束条件。 |
indexes | Index[] | 表的索引,通过使用 @Index 注解来声明,仅在允许自动更新数据库表结构的场景中起到作用,默认没有其他额外的索引。 |
应用示例:
@Table(name="test",indexes= {},catalog="XXX",schema="XXXAAA")
public class Test {.....}
6. @UpdateTimestamp - 更新时自动更新时间,示例:
@Temporal(TemporalType.TIMESTAMP)
@Column(name="UPDATETIME")
@org.hibernate.annotations.UpdateTimestamp
private Date UPDATETIME;
7. @CreationTimestamp - 创建时自动更新时间
@Temporal(TemporalType.TIMESTAMP)
@Column(updatable = false)
@org.hibernate.annotations.CreationTimestamp
private Date CREATETIME;
8. @Version - 版本号,更新时自动加1
@Version
private Long version;
9.@NotNull 非空检查
@NotNull(message="消息内容")
实体非空注解,但是这个在生成数据库结构时会被忽略,在实体保存校验时起作用。
要想在数据库中生成非空约束,应该结合 @Column(nullable=false) 或者 @Basic(optional=false)
当然 Jpa中还有许多的注解,这个可以在使用或见到不认识的注解时,百度一下就好了。
只要心有海阔天空,自然风平浪静。