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 + '\'' +
                '}';
    }
}

 

posted @ 2018-05-09 16:44  Mars.wang  阅读(4108)  评论(0编辑  收藏  举报