在Hibernate中使用注解,主要是为了替代映射文件,完成“类到表,属性到字段”的映射。
JPA提供了一套功能强大的注解。Hibernate直接使用了JPA的这套注解。固然,对于JPA中的一些不足,Hibernate又开发了一些本身的注解。这些注解要么继承自JPA,要么是独立的注解,做为JPA的补充。
故,咱们使用的注解,基本是javax.persistence.Transient包中的。
使用注解时需注意如下几点:
(1)使用的均为javax.persistence.Transient包中的注解
(2)再也不须要映射文件了
(3)在Hibernate主配置文件中无需指定映射文件了,但须要指定注解的实体类。(springboot这一步也省了)java
注解的具体文档在javax.persistence包下的注解类型总结Annotation Type Summry中。spring
根据其标注的位置与完成的功能,Hibernate注解可分为两种:类级注解、属性级注解。
. 类级注解:注解在类的头部。完成类到表的映射。
. 属性级注解:注解在属性上面,或属性的get方法上面。完成属性到字段的映射。sql
(1)@Entity
用在POJO类上,表示当前类为实体类。name属性为实体名称。默认为类的非限定性类名。通常使用默认值。数据库
(2)@Table
与@Entity联合使用。name属性指定映射的表名。默认与实体名称相同。springboot
@Entity @Table(name="city") public class City {}
属性级注解根据其注解属性的不一样,又可分为两类:主键相关注解,与普通属性注解。ide
(1)@Id
用在主键id属性上,或其get方法上,表示当前属性将对应数据库中的主键。this
(2)@GeneratedValue
指定主键值的来源。其属性strategy用于指定主键的生成策略。其值为系统定义好的四种策略之一。默认为AUTO。spa
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来引用便可。hibernate
@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建表语句中对于该字段的建立语句。code
(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 + '\'' + '}'; } }