如何在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. 4-24日 collections模块 random模块 time模块 sys模块 os模块

    1, collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdi ...

  2. Python Django 实用小案例2

    动态导入模块 Django返回序列化数据  动态导入模块 在Django里面,经常会看到一些方法或者类是动态导入,尤其是以settings文件为代表,经常把一些类放在里面动态调配,比如随便拿Djang ...

  3. zabbix系列 ~ 如何更好的利用mysql监控

    一 简介:今天来聊聊一些关于mysql 监控需要关注的问题二 实现的原理   1 global status   2 variables 三 我们需要关注的zabbix性能图  1 事务类型      ...

  4. 2017-2018-2 20165237 实验二《Java面向对象程序设计》实验报告

    ##2017-2018-2 20165237 实验二<Java面向对象程序设计>实验报告 No.1 实验要求: 实验三 敏捷开发与XP实践 http://www.cnblogs.com/r ...

  5. 【Math for ML】矩阵分解(Matrix Decompositions) (下)

    [Math for ML]矩阵分解(Matrix Decompositions) (上) I. 奇异值分解(Singular Value Decomposition) 1. 定义 Singular V ...

  6. swap扩展

    没有独立的分区,本地回环设备(使用软件来模拟实现硬件) 创建一个镜像文件 https://blog.csdn.net/linuxnews/article/details/51271875 有独立的分区

  7. CentOS7开启防火墙及特定端口

    开启防火墙服务 以前为了方便,把防火墙都关闭了,因为现在项目都比较重要,害怕受到攻击,所以为了安全性,现在需要将防火墙开启,接下来介绍一下步骤. 1, 首先查看防火墙状态: firewall-cmd ...

  8. CMake的一些正确姿势

    1, 2,

  9. 【ARTS】01_13_左耳听风-20190204~20190210

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  10. python3-多装饰器的执行顺序

    [例]: def dec1(func): print("HHHA:0====>") def one(): print("HHHA:0.1====>" ...