如何在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的简单整合的更多相关文章

  1. SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

    软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...

  2. Spring data jpa 实现简单动态查询的通用Specification方法

    本篇前提: SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法 这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字 ...

  3. spring boot系列(五)spring boot 配置spring data jpa (查询方法)

    接着上面spring boot系列(四)spring boot 配置spring data jpa 保存修改方法继续做查询的测试: 1 创建UserInfo实体类,代码和https://www.cnb ...

  4. Spring Boot 之Spring data JPA简介

    文章目录 添加依赖 添加entity bean 创建 Dao Spring Data Configuration 测试 Spring Boot 之Spring data JPA简介 JPA的全称是Ja ...

  5. Spring Boot中Spring data注解的使用

    文章目录 Spring Data Annotations @Transactional @NoRepositoryBean @Param @Id @Transient @CreatedBy, @Las ...

  6. Spring Boot集成Spring Data Reids和Spring Session实现Session共享

    首先,需要先集成Redis的支持,参考:http://www.cnblogs.com/EasonJim/p/7805665.html Spring Boot集成Spring Data Redis+Sp ...

  7. Spring Boot 结合Spring Data结合小项目(增,删,查,模糊查询,分页,排序)

    本次做的小项目是类似于,公司发布招聘信息,因此有俩个表,一个公司表,一个招聘信息表,俩个表是一对多的关系 项目整体结构: Spring Boot和Spring Data结合的资源文件 applicat ...

  8. Spring Boot 快速入门 史上最简单

    1.Spring Boot 概述 Spring Boot 是所有基于 Spring 开发的项目的起点.Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的 ...

  9. spring boot 集成 Mybatis,JPA

    相对应MyBatis, JPA可能大家会比较陌生,它并不是一个框架,而是一组规范,其使用跟Hibernate 差不多,原理层面的东西就不多讲了,主要的是应用. Mybatis就不多说了,SSM这三个框 ...

  10. 面试被问为什么使用Spring Boot?答案好像没那么简单

    面试官:项目中有使用Spring Boot吗? 小小白:用过. 面试官:说一下为什么要使用Spring Boot? 小小白:在使用Spring框架进行开发的过程中,需要配置很多Spring框架包的依赖 ...

随机推荐

  1. webpack设置热更新

    首先需要在package.json中配置一个脚本参数 --hot "dev": "webpack-dev-server --mode development --hot& ...

  2. Python 10 协程,异步IO,Paramiko

    本节内容 Gevent协程 异步IO Paramiko 携程 协程,又称为微线程,纤程(coroutine).是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文 ...

  3. 深入理解 RPC

    学习资料 https://juejin.im/book/5af56a3c518825426642e004

  4. bzoj3262: 陌上花开(CDQ+树状数组处理三维偏序问题)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3262 题目大意:中文题目 具体思路:CDQ可以处理的问题,一共有三维空间,对于第一维我们 ...

  5. thymeleaf资源加载问题(从Controller跳转)

    <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <me ...

  6. [Harbor]Docker登录Harbor仓库(HTTP方式)

    Docker登录到Harbor仓库时,不管是使用http协议还是使用https协议,都需要修改一些配置. 这篇文章来介绍一下,在使用http协议时,需要进行什么哪些配置. 首先,确定自己的Harbor ...

  7. RabbitMQ与SpringBoot整合

    RabbitMQ  SpringBoot  一.RabbitMQ的介绍 二.Direct模式 三.Topic转发模式 四.Fanout Exchange形式 原文地址: https://www.cnb ...

  8. GAN_李弘毅讲解

    GAN_李弘毅讲解: 上式中,xi从data中sample的一部分,现在的目的就是最大化这个似然函数,使得Generator最可能产生data中的这些sample: 上式中之所以如此设计V函数,是为了 ...

  9. 【转】HashMap实现原理及源码分析

    哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景极其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出 ...

  10. selenium控制浏览器

    1.要把浏览器设置为全屏,否则有些元素是操作失败的,如对下图进行操作按钮是失败的,因为按钮没有显示出来 2.设置浏览器的宽.高 3.控制前进.后退(不建议使用driver.black().driver ...