Hibernate5.x的相关注解解释。

第一个Hibernate5.x程序中,我使用了大量的注解,而非以前版本的配置文件,因为
新版本hibernate使用JPA(Java Persistence API)注解配置能使我们的开发更加敏捷便利.

    package Bean;

import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name = "t_user", schema = "hib")
//通过 @Table 为实体Bean指定对应数据库表,目录和schema的名字
//@UniqueConstraints 可以定义表的唯一约束。在title,和content加上唯一约束
public class User {
    @Id     //注解意为 id 为 '主键'
    @GeneratedValue(strategy = GenerationType.IDENTITY)     //主键生成策略,
    /**
     *  @GeneratedValue注解来定义生成策略
     *  GenerationType.TABLES 当前主键的值单独保存到一个数据库的表中
     *  GenerationType.SEQUENCE  利用底层数据库提供的序列生成标识符
     *  GenerationType.IDENTITY 采取数据库的自增策略
     *  GenerationType.AUTO 根据不同数据库自动选择合适的id生成方案,这里使用mysql,为递增型
     */
    private Integer id;

    @Column(name = "table_username")            //进行元素在数据库中的命名,如果没有这个注解,
                                                    // 就直接使用属性名为数据表中的列名
    private String username;
    @Column(name = "table_password")
    private String password;

    @Transient          //被标注此注解的属性不会被持久化到数据库
    private String temp;


    /**
     * @Temporal  标注在日期等属性上,声明映射为数据库的特定诶其属性类型,默认为java.sql.Timestamp(TemporalType.TIMESTAMP)
     *  此外还有java.sql.date(TemporalType.DATE)、java.sql.Time(TemporalType.TIME)
     */
    @Temporal(TemporalType.TIME)
    private Date brithDate;


    //get,set方法,以及构造方法。
}
 


以及其他常用注解摘自→实体映射注解

拓展分析

除了上面注释的说明,我们还需要补充的说明是

1. @Column常用属性解析

属性名 说明 默认值
unique 可选,是否在该列上设置唯一约束 false
nullable 可选,是否设置该列的值可以为空 false
insertable 可选,该列是否作为生成的insert语句中的一个列 true
updatable 可选,该列是否作为生成的update语句中的一个列 true
columnDefinition 可选: 为这个特定列覆盖SQL DDL片段 (这可能导致无法在不同数据库间移植)比如我们想把Integer readNum 设为默认0,可使用此属性: INT DEFAULT 0
table 可选,定义对应的表 默认为当前类对应表
length 可选,列长度 255
precision 可选,列十进制精度(decimal precision) 0
scale 可选,如果列十进制数值范围(decimal scale)可用,在此设置 0

如果某属性没有注解,该属性将遵守下面的规则:
1. 如果属性为单一类型,则映射为@Basic
2. 如果属性对应的类型实现了Serializable, 则属性被映射为@Basic并在一个列中保存该对象的serialized版本
3. 如果该属性的类型为java.sql.Clob 或 java.sql.Blob,则作为@Lob并映射到适当的LobType。


2. @Lob注解属性

对于一些容量大的属性如文章、图片的数据,如果我们要保存到数据库,可以使用@Lob注解,先在User类中添加下面一个属性实例:

@Lob
private String text;
@Lob
private Byte[] image;

这时候,我们运行测试方法,hibernate会自动帮我们在数据库中生成相应的”大容量类型“属性:

Field Type Null Default
image longblob YES NULL
text longtext YES NULL

如果我们想自定制数据库中生成的属性类型,可以使用下面示例配置:

@Lob
@Basic(fetch = FetchType.LAZY)
@Column(columnDefinition = "BLOB", nullable = true)
private String pro1;

@Lob
@Basic(fetch = FetchType.LAZY)
@Column(columnDefinition = "tinytext", nullable = true)
private String pro2;

@Lob
@Basic(fetch = FetchType.LAZY)
@Column(columnDefinition = "mediumtext", nullable = true)
private String pro3;

@Lob
@Basic(fetch = FetchType.LAZY)
@Column(columnDefinition = "text", nullable = true)
private String pro4;

此时对应数据库中生成数据类型:

Field Type Null Default
pro1 blob YES NULL
pro2 tinytext YES NULL
pro3 mediumtext YES NULL
pro4 text YES NULL

数据类型对应关系

java、mysql、hibernate数据类型对应关系如下表所示:
这里写图片描述




posted @ 2017-10-15 11:33  过道  阅读(328)  评论(0编辑  收藏  举报