jpa随手笔记
jpa注解
1.设置Pojo为实体
@Entity //标识这个pojo是一个jpa实体
2.设置表名
@Table(name = "users") //指定表名为users
3.设置主键
@Id
4.设置字段类型,通过@Column注解设置,包含的可设置属性如下:
.name:字段名
.unique:是否唯一
.nullable:是否可以为空
.inserttable:是否可以插入
.updateable:是否可以更新
.columnDefinition: 定义建表时创建此列的DDL
.secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字
@Column(name = "teacher_id", nullable = false, columnDefinition = "varchar(50) comment '教师表id'")
private String teacherId;
@Column(name = "user_wages",precision=12, scale=2)//设置属性wages对应的字段为user_wages,12位数字可保留两位小数,可以为空
private double wages;
5.如果在字段上定义了级联关系(如一对多等),通过@JoinColumn来定义关系的属性。多个的时候用@JoinColumns,JoinColumn的大部分属性和Column类似。
• name:列名。
• referencedColumnName:该列指向列的列名(建表时该列作为外键列指向关系另一端的指定列)
• unique: 是否唯一
• nullable: 是否允许为空
• insertable: 是否允许插入
• updatable: 是否允许更新
• columnDefinition: 定义建表时创建此列的DDL
• secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "course_id", nullable = false, insertable = false, updatable = false, columnDefinition = "varchar(50) comment '课程表id'")
private Course course;
6.一对一外键映射关系
@OneToOne(cascade = CascadeType.ALL, mappedBy = "oneA")//主Pojo这方的设置比较简单,只要设置好级联和映射到从Pojo的外键就可以了。
private OneB oneB;
@JoinColumn(name = "ONEA_ID", unique=ture referencedColumnName = "ONEA_ID", insertable = false)//设置从方指向主方的关联外键,这个ONEA_ID
@OneToOne
private OneA oneA;
7.一对多双向映射关系
@OneToMany(cascade = CascadeType.ALL, mappedBy = "oneId")//指向多的那方的pojo的关联外键字段
private Collection<Many> manyCollection;
@JoinColumn(name = "ONE_ID", referencedColumnName = "ONE_ID")//设置对应数据表的列名和引用的数据表的列名
@ManyToOne//设置在“一方”pojo的外键字段上
private One oneId;
8.多对多映射关系
@ManyToMany
@JoinTable(name = "TMANY1_TMANY2", joinColumns = {@JoinColumn(name = "MANYA_ID", referencedColumnName = "MANYA_ID")}
private Collection<ManyB> manybIdCollection;
@ManyToMany(mappedBy = "manybIdCollection")
private Collection<ManyA> manyaIdCollection;
9.@MapKey
在一对多,多对多关系中,我们可以用Map来保存集合对象。默认用主键值做key,如果使用复合主键,则用id class的实例做key,如果指定了name属性,就用指定的field的值做key
下面的代码说明Person和Book之间是一对多关系。Person的books字段是Map类型,用Book的isbn字段的值作为Map的key。
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")
@MapKey(name = "isbn")
private Map books = new HashMap();
10.@OrderBy
在一对多,多对多关系中,有时我们希望从数据库加载出来的集合对象是按一定方式排序的,这可以通过OrderBy来实现,默认是按对象的主键升序排列。
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")
@OrderBy(name = "isbn ASC, name DESC")
private List books = new ArrayList();
11.@Transient
@Transient表示该属性并不是一个到数据库表的字段的映射,指定的这些属性不会被持久化,ORM框架将忽略该属性。
如果一个属性并非数据库表的字段映射。就务必将其标示为@Transient。否则,ORM框架默认其注解为@Basic
@Transient
private String name;
12.@Version
Version指定实体类在乐观事务中的version属性。在实体类重新由EntityManager管理并且加入到乐观事务中时,保证完整性。每一个类只能有一个属性被指定为version,version属性应该映射到实体类的主表上。
@Version
@Column("OPTLOCK")
protected int getVersionNum() { return versionNum; }
13.分页
Pageable pageable = PageRequest.of(page - 1, limit, Sort.by(Sort.Direction.DESC, "createDate"));
BaseSpecification<OperationLog> specification = new BaseSpecification<OperationLog>() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) {
List<Predicate> predicate = new ArrayList<>();
if (StringUtils.isNotEmpty(userName)) {
predicate.add(cb.like(root.get("userName").as(String.class), "%" + userName + "%"));
}
predicate.add(cb.equal(root.get("operationType").as(String.class), "select"));
Predicate[] pre = new Predicate[predicate.size()];
return query.where(predicate.toArray(pre)).getRestriction();
}
};
Page<OperationLog> logPage = operationLogRepository.findAll(specification, pageable);
jpa随手笔记的更多相关文章
- JS SDK 随手笔记
JS SDK 随手笔记 窗口模块 Frame/Multi Frame 对话框 页面间的通讯 生命周期 窗口层叠 窗口模块 窗口模块是是AppCan移动应用界面最基本的单位.窗口是每个界面布局的基础,他 ...
- JPA学习笔记(8)——映射一对多关联关系
一对多关联关系 本文有很多和多对一是一样的,因此不会写得非常具体. 有看不懂的.能够參考JPA学习笔记(7)--映射多对一关联关系 Order实体类 package com.jpa.helloworl ...
- JPA学习笔记1——JPA基础
1.JPA简介: Java持久化规范,是从EJB2.x以前的实体Bean(Entity bean)分离出来的,EJB3以后不再有实体bean,而是将实体bean放到JPA中实现.JPA是sun提出的一 ...
- python3.x随手笔记2
对象,价值观和类型 对象 Python的抽象的数据. 所有的数据在一个Python程序 表示对象或对象之间的关系. (在某种意义上,在 符合冯诺依曼模型的代码也“存储程序计算机” 由对象.) 每一个对 ...
- python3.x随手笔记1
语法分析 Python程序读取的 解析器 . 解析器的输入流 令牌 ,生成的 词法分析程序 . 这一章描述了如何 词法分析程序把一个文件分解成令牌. Python读取程序文本作为Unicode代码点; ...
- JPA学习笔记
一.JPA基础1.1 JPA基础JPA: java persistence api 支持XML.JDK5.0注解俩种元数据的形式,是SUN公司引入的JPA ORM规范 元数据:对象和表之间的映射关系 ...
- Spring学习---JPA学习笔记
用了一段时间的Spring,到现在也只是处于会用的状态,对于深入一点的东西都不太了解.所以决定开始深入学习Spring. 本文主要记录JPA学习.在学习JPA之前,需要了解一些ORM的概念. ORM概 ...
- JPA学习笔记(8)——映射双向一对多关联关系
双向一对多关联关系 前面的博客讲的都是单向的,而本问讲的是双向的(双向一对多 = 双向多对一) 什么是双向? 我们来对照一下单向和双向 单向/双向 User实体类中是否有List< Order& ...
- spring data jpa 学习笔记
springboot 集成 springData Jpa 1.在pom.xml添加依赖 <!-- SpringData-Jpa依赖--> <dependency <groupI ...
随机推荐
- #Linux 下 Xampp的安装与Hello World
一.下载安装 去官网下载 移动下载完毕的xampp-linux-x64-7.4.6-0-installer.run 到/usr/local/jayce-softwares/xampp目录下(jayce ...
- Andrew Ng - 深度学习工程师 - Part 2. 改善深层神经网络:超参数调试、正则化以及优化(Week 2. 优化算法)
===========第2周 优化算法================ ===2.1 Mini-batch 梯度下降=== epoch: 完整地遍历了一遍整个训练集 ===2.2 理解Mini-bat ...
- 修改Git远程地址 git config remote.origin.url "https://..."
仓库管理: 添加或指定远程仓库地址 git remote set-url origin "https://..." git config remote.origin.url &qu ...
- TCP实战一(三握四挥、流量控制)
上一篇博文已经介绍了tcpdump的一些基本操作与命令,今天这篇博文将带你解密如何利用wireshark对tcpdump抓到的数据包进行可视化分析! 参考文献:https://zhuanlan.zhi ...
- Java多线程之volatile详解
本文目录 从多线程交替打印A和B开始 Java 内存模型中的可见性.原子性和有序性 Volatile原理 volatile的特性 volatile happens-before规则 volatile ...
- synchronized与锁升级
1 为什么需要synchronized? 当一个共享资源有可能被多个线程同时访问并修改的时候,需要用锁来保证数据的正确性.请看下图: 线程A和线程B分别往同一个银行账户里面添加货币,A线程从内存中读取 ...
- 01[了解] Dubbo
什么是Dubbo? 概述 Dubbo是阿里巴巴内部使用的分布式业务框架,2012年由阿里巴巴开源. 由于Dubbo在阿里内部经过广泛的业务验证,在很短时间内,Dubbo就被许多互联网公司所采用,并产生 ...
- 一种基于LQR使输出更加稳定的算法(超级实用)
已知: 令: 则: 以上三式成立 具体步骤: 状态量最后一行加入“上一时刻的控制量”: A,B根据上述方法变形: Q,R增加维度(控制量一般都为一个,此时R维度不变): 最关键的是——输出量已经变为“ ...
- 高速缓存一致性协议MESI与内存屏障
一.CPU高速缓存简单介绍 CPU高速缓存机制的引入,主要是为了解决CPU越来越快的运行速度与相对较慢的主存访问速度的矛盾.CPU中的寄存器数量有限,在执行内存寻址指令时,经常需要从内存中读取指令所需 ...
- ip修改器
哈哈,算法来源于网络... 源码:http://pan.baidu.com/s/11P0P9 参考:http://bbs.csdn.net/topics/370201571 http://bbs.cs ...