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框架包的依赖 ...
随机推荐
- byte数组和int之间相互转化的方法
Java中byte数组和int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送者接收的数据都是byte数组,但是int类型是4个byte组成的,如何把一个整形in ...
- jmeter(五)几种不同的content-type方式
今天我们来讲3种常见的content-type方式,及jmeter应用时信息头和传参方式的不同: 参照博客http://www.cnblogs.com/imyalost/p/6726795.html ...
- java.lang.Enum
参考博客链接 java枚举类型的优势在哪里? Java 枚举(enum) 详解7种常见的用法
- javascript常用函数封装——运动、cookie、ajax、获取行内样式兼容写法、拖拽
运动.cookie.ajax.获取行内样式兼容写法.拖拽封装大合集. //url,data,type,timeout,success,error function ajax(options){ //- ...
- java.lang.IllegalStateException: Ambiguous mapping found
原因:Controller 出现相同的url映射 参考: https://blog.csdn.net/u010892841/article/details/52136256
- Tip:JSP标签也称之为Jsp Action(JSP动作)元素
JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. ================ &l ...
- 使用Numpy将数据集中的data和target同时shuffle
假设现在有图像数据imgs和对应标签targets.数据维度分别如下 imgs.shape = (num, channel, width, height) targets.shape = (num, ...
- 阿里云上 配置 vsftpd 配置文件 (一个成功例子)
# # READ THIS: This example file is NOT an exhaustive list of vsftpd options. # Please read the vsft ...
- linux CPU动态调频【转】
转自:https://www.xuebuyuan.com/2185926.html 针对sep4020的linux低功耗研究也有一段时间了,基本把低功耗的实现方式想清楚了(主要分成机制和策略),这段时 ...
- VC,VB操作XML
TCHAR buffer[MAX_PATH] = {}; ::GetModuleFileName(NULL, buffer, MAX_PATH); CString strPath = buffer; ...