Spring Data JPA 从入门到精通~基本注解

 @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 {
......
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据竞赛平台——Kaggle 入门

From&#xff1a;http://blog.csdn.net/u012162613/article/details/41929171 大数据竞赛平台——Kaggle 入门篇 这篇文章适合那些刚接触Kaggle、想尽快熟悉Kaggle并且独立完成一个竞赛项目的网友&#xff0c;对于已经在Kaggle上参赛过的网友来说&#xff0c;大可不必耗费时间…

俄罗斯智库 | 人工智能在军事领域的发展现状及应用前景

本文来自&#xff1a;知远战略与防务研究所原文来自&#xff1a;俄罗斯外交和国防政策委员会网站人工智能在军事领域的发展现状及应用前景本文主要介绍了当今世界及俄罗斯本国人工智能技术发展的现状以及未来该技术在军事领域的应用前景&#xff0c;文章还重点分析了人工智能技…

Internet Explorer 8 使用技巧(3):安全上网

如何上网更安全&#xff1f; 听说过“网络钓鱼”吗&#xff1f;最简单的例子&#xff1a;有不法分子模仿真实的银行网站做了个一模一样的&#xff0c;然后通过邮件或其他方式骗你登录并输入银行账号和密码&#xff0c;结果信息泄露&#xff0c;钱被盗走——这就是最典型的“钓鱼…

java 常量折叠_深入理解Java虚拟机之早期编译器优化

Javac编译器Javac编译器是一个由Java语言编写的程序Javac的源码与调试从Sun Javac的代码来看&#xff0c;编译器大致分为3个过程&#xff1a;解析与填充符号表的过程插入式注解处理器的注解处理过程分析与字节码生成的过程Javac编译动作的入口为com.sun.tools.javac.main.JavaC…

Spring Data JPA 从入门到精通~JpaRepository介绍

从 JpaRepository 开始的子类&#xff0c;都是 Spring Data 项目对 JPA 实现的封装与扩展。JpaRepository 本身继承 PagingAndSortingRepository 接口&#xff0c;是针对 JPA 技术的接口&#xff0c;提供 flush()、saveAndFlush()、deleteInBatch()、deleteAllInBatch() 等方法…

深入理解程序从编译到运行

From&#xff1a;http://blog.chinaunix.net/uid-22327815-id-3540305.html 从 Hello World 说程序运行机制&#xff1a;http://www.sohu.com/a/132798003_505868 C/C 中如何在 main() 函数之前执行一条语句&#xff1f;&#xff1a;https://www.zhihu.com/question/26031933 …

用VML画图(一些基本的矢量图)(转)

用VML画图(一些基本的矢量图) 注&#xff1a;其中所有的left:top:都是针对图左上角的&#xff0c;比如圆&#xff0c;他的左上角应该是以圆为中心的矩形的左上角 1.line(直线) a.示例&#xff1a; <html xmlns:v"urn:schemas-microsoft-com:vml"> <head>…

技术力量 | 社会计算与计算社会: 智慧社会的基础与必然

来源&#xff1a;智慧城市决策参考摘要&#xff1a;基于社会计算&#xff0c;智慧社会可充分利用开放流动的大数据资源, 综合协调人、地、事、物和组织等各种要素, 形成信息对称、权利对等、扁平化组织的社会结构, 推动传统社会管理模式向分布式、集约化、信息化、智能化、全响…

php关闭当前页_php如何直接关闭页面注销SESSION

php如何直接关闭页面注销SESSION发布时间&#xff1a;2020-07-09 09:03:06来源&#xff1a;亿速云阅读&#xff1a;100作者&#xff1a;Leah这篇文章将为大家详细讲解有关php如何直接关闭页面注销SESSION&#xff0c;文章内容质量较高&#xff0c;因此小编分享给大家做个参考&a…

ELF格式文件符号表全解析及readelf命令使用方法

From&#xff1a;http://blog.csdn.net/yasi_xi/article/details/45197583 readelf命令&#xff1a;http://man.linuxde.net/readelf ELF文件格式解析&#xff1a;https://www.2cto.com/kf/201605/511370.html ELF文件格式解析&#xff1a;http://blog.csdn.net/earbao/arti…

Spring Data JPA 从入门到精通~QueryByExampleExecutor的使用

QueryByExampleExecutor 的使用 按示例查询&#xff08;QBE&#xff09;是一种用户友好的查询技术&#xff0c;具有简单的接口&#xff0c;它允许动态查询创建&#xff0c;并且不需要编写包含字段名称的查询。从 UML 图中&#xff0c;可以看出继承 JpaRepository 接口后&#…

老赵书托(1):写在前面

最近我思考和总结地越来越多&#xff0c;感觉也是时候把自己许多年来的经验进行一番总结和整理。谈基础与能力的时候&#xff0c;我把人脑比喻为“存储器”&#xff0c;里面存放了“知识”和“能力”等信息。而思考和总结便可以看作对这些信息的索引进行整理&#xff0c;好比数…

谷歌大脑提出对智能体进行「正向-反向」强化学习训练,加速训练过程

原文来源&#xff1a;arXiv作者&#xff1a;Ashley D. Edwards、Laura Downs、James C. Davidson「雷克世界」编译&#xff1a;嗯~是阿童木呀、KABUDA、EVA在强化学习问题中&#xff0c;关于任务目标的制定&#xff0c;往往需要开发人员花费很多的精力&#xff0c;在本文中&…

php 元_PHP 享元模式 - 304158的个人空间 - OSCHINA - 中文开源技术交流社区

/*** 享元模式* 共享子系统* 抽象子系统实现接口* 根据key储存对应的子系统实例*//*** Interface ServiceIO* 共享子系统抽象接口*/interface ServiceIO {public function GetServiceName();}/*** Class WebService* 子系统 实例*/class WebService implements ServiceIO {priv…

Linux二进制实用工具Binutils工具集解析()

From&#xff1a;http://blog.csdn.net/zqixiao_09/article/details/50783007 GNU Binutils&#xff1a;http://www.gnu.org/software/binutils/ GNU Binutils详解&#xff1a;http://www.crifan.com/files/doc/docbook/binutils_intro/release/html/binutils_intro.html 交叉…

Spring Data JPA 从入门到精通~JpaSpecificationExecutor的使用方法

JpaSpecificationExecutor 源码和 API 我们也可以通过 idea 工具详细看其用法和实现类&#xff0c;JpaSpecificationExecutor 是 Repository 要继承的接口&#xff0c;而 SimpleJpaRepository 是其默认实现。而通过源码来看其提供的 API 比较简单、明了&#xff0c;有如下几个方…

Error loading native library: libnjni9.so.的解决办法

Error loading native library: libnjni9.so.的解决办法 $ netcaError loading native library: libnjni9.so.java.lang.UnsatisfiedLinkError: jniGetOracleHomeat oracle.net.common.NetGetEnv.getOracleHome(NetGetEnv.java)at oracle.net.ca.CmdlineArgs.setOraArgs(Cmdlin…

谷歌人工智能野心:从“下围棋”开始走向商用赚钱

来源&#xff1a;腾讯科技作为人工智能研发的领先企业&#xff0c;谷歌已经开始从技术研发走向了产品商用&#xff0c;创造营收成为一个新目标。谷歌在人工智能领域进行研发的时间比较长&#xff0c;陆续收购了优秀的专业公司。鉴于此&#xff0c;谷歌获得了先发优势&#xff0…

浅谈弹性页面布局

今天在博客园看了冰极峰先生的《弹性流体布局》文章&#xff0c;他具体的讲解了弹性布局是用到min-width这个属性,但这个属性在IE6下不受支持,因此加入了老外的一个JS脚本,这个脚本让IE6也能支持最小,最大宽度(高度)四个属性.弹性布局其实最难的还不是布局&#xff0c;而是里面…

Spring Data JPA 从入门到精通~Criteria概念的简单介绍

&#xff08;1&#xff09;Root<T> root 代表了可以查询和操作的实体对象的根&#xff0c;如果将实体对象比喻成表名&#xff0c;那 root 里面就是这张表里面的字段&#xff0c;这不过是 JPQL 的实体字段而已。通过里面的 Path<Y> get(String attributeName)&…