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框架包的依赖 ...
随机推荐
- webpack设置热更新
首先需要在package.json中配置一个脚本参数 --hot "dev": "webpack-dev-server --mode development --hot& ...
- Python 10 协程,异步IO,Paramiko
本节内容 Gevent协程 异步IO Paramiko 携程 协程,又称为微线程,纤程(coroutine).是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文 ...
- 深入理解 RPC
学习资料 https://juejin.im/book/5af56a3c518825426642e004
- bzoj3262: 陌上花开(CDQ+树状数组处理三维偏序问题)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3262 题目大意:中文题目 具体思路:CDQ可以处理的问题,一共有三维空间,对于第一维我们 ...
- thymeleaf资源加载问题(从Controller跳转)
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <me ...
- [Harbor]Docker登录Harbor仓库(HTTP方式)
Docker登录到Harbor仓库时,不管是使用http协议还是使用https协议,都需要修改一些配置. 这篇文章来介绍一下,在使用http协议时,需要进行什么哪些配置. 首先,确定自己的Harbor ...
- RabbitMQ与SpringBoot整合
RabbitMQ SpringBoot 一.RabbitMQ的介绍 二.Direct模式 三.Topic转发模式 四.Fanout Exchange形式 原文地址: https://www.cnb ...
- GAN_李弘毅讲解
GAN_李弘毅讲解: 上式中,xi从data中sample的一部分,现在的目的就是最大化这个似然函数,使得Generator最可能产生data中的这些sample: 上式中之所以如此设计V函数,是为了 ...
- 【转】HashMap实现原理及源码分析
哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景极其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出 ...
- selenium控制浏览器
1.要把浏览器设置为全屏,否则有些元素是操作失败的,如对下图进行操作按钮是失败的,因为按钮没有显示出来 2.设置浏览器的宽.高 3.控制前进.后退(不建议使用driver.black().driver ...