@Entity、@Table、@Id、@GeneratedValue、@Basic、@Column、@Transient、@Lob、@Temporal

先看一个 Blog 的案例其中实体的配置如下:

@Entity
@Table(name = "user_blog", schema = "test")
public class UserBlogEntity {@Id@Column(name = "id", nullable = false)@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;@Column(name = "title", nullable = true, length = 200)private String title;@Basic@Column(name = "create_user_id", nullable = true)private Integer createUserId;@Basic@Column(name = "blog_content", nullable = true, length = -1)@Lobprivate String blogContent;@Basic(fetch = FetchType.LAZY)@Column(name = "image", nullable = true)@Lobprivate byte[] image;@Basic@Column(name = "create_time", nullable = true)@Temporal(TemporalType.TIMESTAMP)private Date createTime;@Basic@Column(name = "create_date", nullable = true)@Temporal(TemporalType.DATE)private Date createDate;@Transientprivate String transientSimple;
......
}

下面对上面类中用到的注解来一一解释一下。

(1)@Entity 用于定义对象将会成为被 JPA 管理的实体,将字段映射到指定的数据库表中,源码如下:

public @interface Entity {//可选,默认是次实体类的名字,全局唯一。String name() default "";
}

(2)@Table 用于指定数据库的表名:

public @interface Table {//表的名字,可选。如果不填写,系统认为好实体的名字一样为表名。String name() default "";//此表的catalog,可选String catalog() default "";//此表所在schema,可选String schema() default "";//唯一性约束,只有创建表的时候有用,默认不需要。UniqueConstraint[] uniqueConstraints() default { };//索引,只有创建表的时候使用,默认不需要。Index[] indexes() default {};
}

(3)@Id 定义属性为数据库的主键,一个实体里面必须有一个,并且必须和 @GeneratedValue 配合使用和成对出现。

(4)@IdClass 利用外部类的联合主键,源码:

public @interface IdClass {
//联合主键的类Class value();
}

作为符合主键类,要满足以下几点要求。

  • 必须实现 Serializable 接口。
  • 必须有默认的 public 无参数的构造方法。
  • 必须覆盖 equals 和 hashCode 方法。equals 方法用于判断两个对象是否相同,EntityManger 通过 find 方法来查找 Entity 时,是根据 equals 的返回值来判断的。本例中,只有对象的 name 和 email 值完全相同时或同一个对象时则返回 true,否则返回 false。hashCode 方法返回当前对象的哈希码,生成 hashCode 相同的概率越小越好,算法可以进行优化。

(5)@IdClass 用法

5.1)假设 UserBlog 的联合主键是 createUserId 和 title,新增一个 UserBlogKey 的类。

UserBlogKey.class

import java.io.Serializable;
public class UserBlogKey implements Serializable {private String title;private Integer createUserId;public UserBlogKey() {}public UserBlogKey(String title, Integer createUserId) {this.title = title;this.createUserId = createUserId;}
.....//get set 方法我们略过
}

5.2)UserBlogEntity.java 稍加改动,实体类上需要加 @IdClass 注解和两个主键上都得加 @Id 注解,如下。

@Entity
@Table(name = "user_blog", schema = "test")
@IdClass(value = UserBlogKey.class)
public class UserBlogEntity {@Column(name = "id", nullable = false)private Integer id;@Id@Column(name = "title", nullable = true, length = 200)private String title;@Id@Column(name = "create_user_id", nullable = true)private Integer createUserId;
......//不变的部分我们省略
}

5.3)UserBlogRepository 我们做的改动:

public interface UserBlogRepository extends JpaRepository<UserBlogEntity,UserBlogKey>{
}

5.4)使用的时候:

@RequestMapping(path = "/blog/{title}/{createUserId}")
@ResponseBody
public Optional<UserBlogEntity> showBlogs(@PathVariable(value = "createUserId") Integer createUserId,@PathVariable("title") String title) {return userBlogRepository.findById(new UserBlogKey(title,createUserId));
}

(6)@GeneratedValue 主键生成策略:

public @interface GeneratedValue {//Id的生成策略GenerationType strategy() default AUTO;//通过Sequences生成Id,常见的是Orcale数据库ID生成规则,这个时候需要配合@SequenceGenerator使用String generator() default "";
}

GenerationType 一共有以下四个值:

public enum GenerationType {//通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。TABLE,//通过序列产生主键,通过 @SequenceGenerator 注解指定序列名, MySql 不支持这种方式;SEQUENCE,//采用数据库ID自增长, 一般用于mysql数据库IDENTITY,
//JPA 自动选择合适的策略,是默认选项;AUTO
}

(7)@Basic 表示属性是到数据库表的字段的映射。如果实体的字段上没有任何注解,默认即为 @Basic。

public @interface Basic {//可选,EAGER(默认):立即加载;LAZY:延迟加载。(LAZY主要应用在大字段上面)FetchType fetch() default EAGER;//可选。这个字段是否可以为null,默认是true。boolean optional() default true;
}

(8)@Transient 表示该属性并非一个到数据库表的字段的映射,表示非持久化属性。JPA 映射数据库的时候忽略它,与 @Basic 相反的作用。

(9)@Column 定义该属性对应数据库中的列名。

public @interface Column {//数据库中的表的列名;可选,如果不填写认为字段名和实体属性名一样。String name() default "";//是否唯一。默认flase,可选。boolean unique() default false;//数据字段是否允许空。可选,默认true。boolean nullable() default true;//执行insert操作的时候是否包含此字段,默认,true,可选。boolean insertable() default true;//执行update的时候是否包含此字段,默认,true,可选。boolean updatable() default true;//表示该字段在数据库中的实际类型。String columnDefinition() default "";//数据库字段的长度,可选,默认255int length() default 255;
}

(10)@Temporal 用来设置 Date 类型的属性映射到对应精度的字段。

  • @Temporal(TemporalType.DATE)映射为日期 // date (只有日期)
  • @Temporal(TemporalType.TIME)映射为日期 // time (是有时间)
  • @Temporal(TemporalType.TIMESTAMP)映射为日期 // date time (日期+时间)

(11)@Enumerated 这个注解很好用,直接映射 enum 枚举类型的字段。

1)看源码:

public @interface Enumerated {
//枚举映射的类型,默认是ORDINAL(即枚举字段的下标)。EnumType value() default ORDINAL;
}
public enum EnumType {//映射枚举字段的下标ORDINAL,//映射枚举的NameSTRING
}

2)看例子:

//有一个枚举类,用户的性别
public enum Gender {MAIL("男性"), FMAIL("女性");private String value;private Gender(String value) {this.value = value;}
}
//实体类@Enumerated的写法如下
@Entity
@Table(name = "tb_user")
public class User implements Serializable {@Enumerated(EnumType.STRING)@Column(name = "user_gender")private Gender gender;.......................
}

这时候插入两条数据,数据库里面的值是 MAIL/FMAIL,而不是“男性”/女性。

如果我们用 @Enumerated(EnumType.ORDINAL),这时候数据库里面的值是 0,1。但是实际工作中,不建议用数字下标,因为枚举里面的属性值是会不断新增的,如果新增一个,位置变化了就惨了。

(12)@Lob 将属性映射成数据库支持的大对象类型,支持以下两种数据库类型的字段。

  • Clob(Character Large Ojects)类型是长字符串类型,java.sql.Clob、Character[]、char[] 和 String 将被映射为 Clob 类型。
  • Blob(Binary Large Objects)类型是字节类型,java.sql.Blob、Byte[]、byte[]和实现了 Serializable 接口的类型将被映射为 Blob 类型。
  • 由于 Clob,Blob 占用内存空间较大一般配合 @Basic(fetch=FetchType.LAZY) 将其设置为延迟加载。

(13)@SqlResultSetMapping、@EntityResult、@ColumnResult 配合 @NamedNativeQuery 一起使用的。

在实际工作中不建议这样配置,因为必要性比较少,如果这种配置多了会把 @entity 用配置 XML 思路。看一个案例简单说明一下:

@NamedNativeQueries({@NamedNativeQuery(name = "getUsers",query = "select id,username,usertype from t_xfw_operator order by id desc",resultSetMapping = "usersMap")
})
@SqlResultSetMappings({@SqlResultSetMapping(name = "usersMap",entities = {},columns = {@ColumnResult(name = "id"),@ColumnResult(name="username"),@ColumnResult(name="usertype")})
})
@Entity
@Table(name = "operator")
public class Operator {
......
}

Spring Data JPA 从入门到精通~基本注解相关推荐

  1. Spring Data JPA 从入门到精通~@EntityListeners注解示例

    被@Prepersist注解的方法 ,完成save之前的操作. 被@Preupdate注解的方法 ,完成update之前的操作. 被@PreRemove注解的方法 ,完成remove之前的操作. 被@ ...

  2. Spring Data JPA 从入门到精通~@Version处理乐观锁的问题

    @Version 处理乐观锁的问题 @Version 乐观锁介绍 我们在研究 Auditing 的时候,发现了一个有趣的注解 @Version,源码如下: package org.springfram ...

  3. spring data jpa从入门到精通_Spring Data JPA的简单入门

    前言 spring data JPA是spring团队打造的sping生态全家桶的一部分,本身内核使用的是hibernate核心源码,用来作为了解java持久层框架基本构成的样本是再好不过的选择.最近 ...

  4. Spring Data JPA 从入门到精通~Naming命名策略详解及其实践

    Naming 命名策略详解及其实践 用 JPA 离不开 @Entity 实体,我都知道实体里面有字段映射,而字段映射的方法有两种: 显式命名:在映射配置时,设置的数据库表名.列名等,就是进行显式命名, ...

  5. Spring Data JPA 从入门到精通~默认数据源的讲解

    默认数据源 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://1 ...

  6. Spring Data JPA 从入门到精通~Auditing及其事件详解

    Auditing 及其事件详解 Auditing 翻译过来是审计和审核,Spring 的优秀之处在于帮我们想到了很多繁琐事情的解决方案,我们在实际的业务系统中,针对一张表的操作大部分是需要记录谁什么时 ...

  7. Spring Data JPA 从入门到精通~实际工作的应用场景

    在实际工作中,有哪些场景会用到自定义 Repository 呢,这里列出几种实际在工作中的应用案例. 1. 逻辑删除场景 可以用到上面说的两种实现方式,如果有框架级别的全局自定义 Respositor ...

  8. Spring Data JPA 从入门到精通~自定义实现Repository

    EntityManager 的获取方式 我们既然要自定义,首先讲一下 EntityManager 的两种获取方式. 1. 通过 @PersistenceContext 注解. 通过将 @Persist ...

  9. Spring Data JPA 从入门到精通~EntityManager介绍

    EntityManager 介绍 我们前面已经无数次提到了,JPA 的默认 Repository 的实现类是 SimpleJpaRepository,而里面的具体实现就是调用的 EntityManag ...

最新文章

  1. 智课雅思词汇---十、pend是什么意思
  2. R语言包_plotly
  3. 分享一个Go按行读取命令行输入的例子
  4. Java :BufferedWriter类和BufferedReader类的构造方法、主要方法
  5. 【赠书】阿里巴巴官方出品,工业级知识图谱最新书籍领取!
  6. (译)在Objective-c里面使用property教程
  7. 7-8 哈利·波特的考试 (25 分)(详解+思路分析)真香啊
  8. mysql简单指令_Mysql基本指令
  9. table多行表头合并 vue_vue elementUI table 自定义表头和行合并的实例代码
  10. BZOJ2658 ZJOI2012 小蓝的好友(treap)
  11. 最近运气不好。很不爽!!!!!
  12. 考研数学 - 初数基础整理09
  13. 不能为属性:[commandName]找到setter 方法
  14. 深入浅出Go Runtime
  15. 电脑拖机,win10一台电脑两人用
  16. 有哪些值得推荐的数据可视化工具?
  17. 【黑盒测试用例设计方法5】正交试验法及其示例
  18. 计算机组装有哪些,DIY电脑组装需要哪些东西
  19. IDEA添加快捷注释功能
  20. CClientDC类

热门文章

  1. 《C#与.net高级编程》——第一支柱:C#的封装
  2. KnockoutJS-与服务端交互
  3. SQL Server创建Job, 实现执行相同脚本而产生不同作业计划的探究
  4. spring data jpa update
  5. 树状数组-神奇的二进制
  6. Nginx 反向代理+高可用
  7. HTML基础做出属于自己的完美网页
  8. itextsharp c# asp.net 生成 pdf 文件
  9. 不够优秀就不要腆着脸继续占便宜——作者:杨毅
  10. linux网络编程——boa移植