Hibernate注解(一):基本注解
在Hibernate中使用注解,主要是为了替代映射文件,完成“类到表,属性到字段”的映射。
JPA提供了一套功能强大的注解。Hibernate直接使用了JPA的这套注解。当然,对于JPA中的一些不足,Hibernate又开发了一些自己的注解。这些注解要么继承自JPA,要么是独立的注解,作为JPA的补充。
故,我们使用的注解,基本是javax.persistence.Transient包中的。
使用注解时需注意以下几点:
(1)使用的均为javax.persistence.Transient包中的注解
(2)不再需要映射文件了
(3)在Hibernate主配置文件中无需指定映射文件了,但需要指定注解的实体类。(springboot这一步也省了)
注解的具体文档在javax.persistence包下的注解类型总结Annotation Type Summry中。
1、Hibernate基本注解
根据其标注的位置与完成的功能,Hibernate注解可分为两种:类级注解、属性级注解。
. 类级注解:注解在类的头部。完成类到表的映射。
. 属性级注解:注解在属性上面,或属性的get方法上面。完成属性到字段的映射。
第一类:类级注解
(1)@Entity
用在POJO类上,表示当前类为实体类。name属性为实体名称。默认为类的非限定性类名。一般使用默认值。
(2)@Table
与@Entity联合使用。name属性指定映射的表名。默认与实体名称相同。
@Entity @Table(name="city") public class City {}
第二类:属性级注解
属性级注解根据其注解属性的不同,又可分为两类:主键相关注解,与普通属性注解。
主键相关注解
(1)@Id
用在主键id属性上,或其get方法上,表示当前属性将对应数据库中的主键。
(2)@GeneratedValue
指定主键值的来源。其属性strategy用于指定主键的生成策略。其值为系统定义好的四种策略之一。默认为AUTO。
GenerationType.AUTO:根据底层数据库自动选择(默认)若数据库支持自增长,则为自增长。类似于配置文件中的native生成策略。
在MySql中使用该策略,自动选择了Sequence生成方式。即主键值来自于序列表,而序列表由DB自己维护。查看数据库可看到,其创建了两个表,一个是映射表t_student,另一个则是序列表hibernate_sequence。
后台报错,查看错误信息,提示需要填充该序列表:you need to populate the table: hibernate_sequence。打开表hibernate_sequence,发现表中为空,即序列为空。需要为序列表指定一个初始值。填值为1后,再运行就不报错了。
GenerationType.IDENTITY:根据数据库的Identity字段生成。类似于配置文件中的indentity生成策略。
GenerationType.SEQUENCE:使用Sequence来决定主键的取值。类似于配置文件中的Sequence生成策略。
GenerationType.TABLE:使用指定表来决定主键取值,结合@TableGenerator使用。
注解中的生成策略只有四种。若要使用Hibernae映射文件中的主键生成器,则可使用@GenericGenerator指定一个Hibernate主键生成器,再使用@GeneratedValue的属性generator来引用即可。
@Id @GeneratedValue(generator = "city") @GenericGenerator(name ="city",strategy = "native") @Column(name="CityId") private Integer cityId;
(1)@Column
可将属性映射到列,描述了数据库表中该字段的详细定义。该注解的属性较多。
name:可选,表示DB中该字段的名称,默认与属性名相同
nullable:可选,表示该字段是否允许为 null,默认为 true
unique:可选,表示该字段是否唯一,默认为 false
length:可选,表示该字段的大小,仅对 String 类型的字段有效,默认值255
insertable:可选,表示该字段是否可以出现在insert语句中。默认为 true。通常主键、时间戳等字段的该值设置为false。因为它们的值都是自动生成的,不需要在insert时插入。
updateable:可选,表示该字段是否可以出现在update语句中。默认为true。通过对于一经创建就不用修改的字段,如birthday、gender等,可将该值设置为false。
table:可选。当前字段所在的表。默认为当前表。
precision和scale:表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。
columnDefinition:可选。用于覆盖数据库DDL建表语句中对于该字段的创建语句。
(2)@Basic与@Transient
@Basic:表示该字段将映射到DB中。是属性的默认注解。
@Transient:表示该字段将不映射到DB中。(无属性)
(3)@Version
可以在实体bean中使用@Version注解,通过这种方式可添加对乐观锁定的支持。(无属性)
(4)@Temporal
Java代码中使用的时间日期类型为java.util包下的Time、Date与Timestamp。而注解使用的则为java.sql包下的Time、Date与Timestamp。@Temporal表示将java.util包下的类映射为java.sql包下的相应类。
java.sql包下的Date、Time与Timestamp这三种时间,其精确度是不同。具体如下:
import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; /** * Created by wangbin10 on 2018/4/25. */ @Entity @Table(name="city") public class City { @Id @GeneratedValue(generator = "city") @GenericGenerator(name ="city",strategy = "native") @Column(name="CityId") private Integer cityId; @Column(name="CityName") private String cityName; public Integer getCityId() { return cityId; } public void setCityId(Integer cityId) { this.cityId = cityId; } public String getCityName() { return cityName; } public void setCityName(String cityName) { this.cityName = cityName; } @Override public String toString() { return "City{" + "cityId=" + cityId + ", cityName='" + cityName + '\'' + '}'; } }