spring-boot与spring-data-JPA的简单整合
如何在boot中轻松使用JPA
<!--首先引入JPA依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
以用户角色为例,其中用户表,角色表,还有一张中间表,用户角色表,首先先创建对应的实体类
/**
* 用户类
*/
@Data
@Entity
public class Account extends DefaultValidate implements Login {
@Id
@GeneratedValue
private Integer id; /**
* 登录名
*/
@NotNull(message = "登录名不能为空")
@Size(min = 2, max = 50)
@Column(name="login_name")
private String loginName; /**
* 账户名
*/
@NotNull(message = "账户名不能为空")
@Size(min = 2, max = 50)
@Column(name="account_name")
private String accountName; /**
* 登录密码
*/
@Column(name="login_pwd")
private String loginPwd; /**
* 账户标识码
*/
@Column(name="account_code")
private String accountCode; /**
* 中间表 并不需要实体类 自动生成
*/
@ManyToMany(cascade=CascadeType.REFRESH,fetch=FetchType.LAZY)
@JoinTable(name = "account_role",
joinColumns = { @JoinColumn(name = "account_id") },
inverseJoinColumns = { @JoinColumn(name = "role_id") })
private Set<Role> roles = new HashSet<Role>();
}
/*
* 角色类
* @date 2018年3月22日上午10:17:11
*/
@Data
@Entity
public class Role extends DefaultValidate {
@Id
@GeneratedValue
private Integer id; /**
* 角色标识
*/
@NotNull(message = "角色标识不能为空")
@Size(min = 2, max = 50)
@Column(name="role_code")
private String roleCode; /**
* 角色名称
*/
@NotNull(message = "角色名称不能为空")
@Size(min = 2, max = 50)
@Column(name="role_name")
private String roleName; }
这样子对应的 实体类便创建完成,上面用到的映射关系为单向的多对多,接着创建对应的repository
@Repository
public interface AccountReposity extends JpaRepository<Account, Integer> { }
使用的时候调用其对应的方法即可。接下去介绍一下对应的动态查询,动态查询需要repository继承JpaSpecificationExecutor类,
public Page<Flow> mySubmission(MySubmitPageDto selectDto) {
LOGGER.info("查询我的提交开始。。。。") ;
PageRequest pageable =new PageRequest(selectDto.getPageNum(), selectDto.getPageSize());
//匿名内部类
Specification<Flow> specification = new Specification<Flow>() {
/**
* Predicate:代表一个查询条件
* root:查询的实体类
* query:可以从中得到root对象 ,即告知查询那个实体类,添加查询条件(其中排序什么的可以通过query去设置)
* cb:用于创建CriteriaBuilder相关对象的工厂,可以从中获取到Predicate对象
*/
@Override
public Predicate toPredicate(Root<Flow> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicateList = new ArrayList<Predicate>();
predicateList.add(cb.equal(root.<String>get("flowStarter"), selectDto.getUserCode()));
Predicate[] p =new Predicate[predicateList.size()];
return cb.and(predicateList.toArray(p));
}
};
Page<Flow> page = flowRepository.findAll(specification, pageable);
LOGGER.info("查询我的提交结束。。。。") ;
return page;
}
如果有很复杂的动态查询,推荐结合Spring-JDBC去操作,写动态的原生sql比较方便开发。
JPA对象的生命周期:
New:瞬时对象,尚未有id,还未和Persistence Context建立关联的对象。
Managed:持久化受管对象,有id值,已经和Persistence Context建立了关联的对象。
Datached:游离态离线对象,有id值,但没有和Persistence Context建立关联的对象。
Removed:删除的对象,有id值,尚且和Persistence Context有关联,但是已经准备好从数据库中删除
JPA查询出来的对象处于持久态的时候,调用改对象属性的set方法的时候会去动态的修改数据库。可以通过
@PersistenceContext
private EntityManager entityManger;
调用manager的clear方法释放对象即可。
如果涉及枚举类属性,可以重写其set,get方法即可,如:
public WarehouseStatusEnum getState() {
return WarehouseStatusEnum.getWarehouseStatusEnum(this.state);
}
public void setState(WarehouseStatusEnum state) {
this.state = state.value();
}
spring-boot与spring-data-JPA的简单整合的更多相关文章
- SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法
软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...
- Spring data jpa 实现简单动态查询的通用Specification方法
本篇前提: SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法 这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字 ...
- spring boot系列(五)spring boot 配置spring data jpa (查询方法)
接着上面spring boot系列(四)spring boot 配置spring data jpa 保存修改方法继续做查询的测试: 1 创建UserInfo实体类,代码和https://www.cnb ...
- Spring Boot 之Spring data JPA简介
文章目录 添加依赖 添加entity bean 创建 Dao Spring Data Configuration 测试 Spring Boot 之Spring data JPA简介 JPA的全称是Ja ...
- Spring Boot中Spring data注解的使用
文章目录 Spring Data Annotations @Transactional @NoRepositoryBean @Param @Id @Transient @CreatedBy, @Las ...
- Spring Boot集成Spring Data Reids和Spring Session实现Session共享
首先,需要先集成Redis的支持,参考:http://www.cnblogs.com/EasonJim/p/7805665.html Spring Boot集成Spring Data Redis+Sp ...
- Spring Boot 结合Spring Data结合小项目(增,删,查,模糊查询,分页,排序)
本次做的小项目是类似于,公司发布招聘信息,因此有俩个表,一个公司表,一个招聘信息表,俩个表是一对多的关系 项目整体结构: Spring Boot和Spring Data结合的资源文件 applicat ...
- Spring Boot 快速入门 史上最简单
1.Spring Boot 概述 Spring Boot 是所有基于 Spring 开发的项目的起点.Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的 ...
- spring boot 集成 Mybatis,JPA
相对应MyBatis, JPA可能大家会比较陌生,它并不是一个框架,而是一组规范,其使用跟Hibernate 差不多,原理层面的东西就不多讲了,主要的是应用. Mybatis就不多说了,SSM这三个框 ...
- 面试被问为什么使用Spring Boot?答案好像没那么简单
面试官:项目中有使用Spring Boot吗? 小小白:用过. 面试官:说一下为什么要使用Spring Boot? 小小白:在使用Spring框架进行开发的过程中,需要配置很多Spring框架包的依赖 ...
随机推荐
- jstl和EL表达式混合使用
EL表达式里判断字符串,或者... ${(wrt.acceptName eq '刘立荣') || (wrt.acceptName eq '卢伟冰') } <tr> <td heigh ...
- [ASP.net教程]IIS服务器 远程发布(Web Deploy)配置
asp.net 网站有三种常用的发布方式:分别是拷贝开发机上发布好的文件到服务器硬盘上.打包成安装程序到服务器上安装.通过Visual Studio 开发平台远程发布到服务器. 在asp.net网站的 ...
- 在github上创建自己的项目
使用过很多次github 但一直是把别人的项目clone下来,并没有自己创建过项目.所以记录一下~ 首先,创建一个仓库 填写工程名之后就创建好啦 然后clone代码到本地 就和正常的使用完全一样啦 ~ ...
- mysql查询反斜杠字符串问题
马上上线发现一个问题,太坑了 写一个查询语句,明明数据库中有,但是就是查不到,后来发现是反斜杠的问题 比如 数据库中有一个字段名称为 name 存储的值为 “海尔厨电\洗碗机” 当我使用如下sql查 ...
- Django学习手册 - reverse()反转URL
前端: <h1>测试</h1> <a href="/ce_test/?id=1">1按键</a> <a href=" ...
- jquery判断表单内容是否为空
//判断表单数据是否为空 var t = $('form').serializeArray(); $.each(t,function(i,item){ if(item['value'] == '') ...
- Redis protected-mode属性解读
redis3.2版本后新增protected-mode配置,默认是yes,即开启.设置外部网络连接redis服务,设置方式如下: 1.关闭protected-mode模式,此时外部网络可以直接访问 2 ...
- 机器学习超参数优化算法-Hyperband
参考文献:Hyperband: Bandit-Based Configuration Evaluation for Hyperparameter Optimization I. 传统优化算法 机器学习 ...
- 刷题之路第三题--Longest Substring Without Repeating Characters
问题简介:求给定字符串中最长的字符不重复的字符串的长度 问题详解: 给定一个字符串,寻找给定字符串中包含的最长的字符不重复的字符串的长度 注:答案必须是子字符串,不是子序列 是连续的字符不重复的字符串 ...
- kali linux 安装 matlab2016Rb
分享安装包: https://pan.baidu.com/s/1hrBd3Li 密码:u9q3 由于Linux版的分为两个镜像,需要挂载后合并: mount R2016b_glnxa64_dvd1.i ...