Jpa基础知识点
Jpa基础知识点
- JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
- Spring Data JPA是较大的Spring Data系列的一部分,可轻松实现基于JPA的存储库。该模块处理对基于JPA的数据访问层的增强支持。它使构建使用数据访问技术的Spring支持的应用程序变得更加容易。
1.JPA的基本配置
- pom依赖
plaintext
1 | <dependency> |
2. 项目配置文件
plaintext
1 | spring: |
3. 创建一个简单实体类
plaintext
1 | package io.kid1999.teacher_manager.model; |
4. 创建一些关联关系的对象
- 关联关系必须注意维护端和被维护端的选取
- 在一对多中,多的一方作为维护端,一的一方作为被维护端
- 在一对一中,任意选取一方作为维护端,宁一方作为被维护端
- 在多对多中,任意选取一方作为维护端,但必须记住中间表的关系由维护端负责
1. 多对一 的配置
plaintext
1 | package io.kid1999.teacher_manager.model; |
2. 一对多 的配置
plaintext
1 | package io.kid1999.teacher_manager.model; |
测试:学生和班级之间的多对一关系
plaintext
1 | @Autowired |
3. 一对一 的配置
plaintext
1 | package io.kid1999.teacher_manager.model; |
plaintext
1 | package io.kid1999.teacher_manager.model; |
测试 教师和班级之间的一对一关系
plaintext
1 | @Transactional |
3.多对多 的配置
plaintext
1 | package io.kid1999.teacher_manager.model; |
plaintext
1 | package io.kid1999.teacher_manager.model; |
测试 学生和身份之间的多对多关系
- 选取的学生作为维护端 所以只能在学生注册时添加对应的关系plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18@Transactional
void TestManyToMany(){
Student student = new Student();
student.setStudentId(123);
student.setStudentName("kid");
student.setGradeId(2);
student.setRoles(roleRepository.findAll());
studentRepository.save(student); // 插入
// Role role = new Role();
// role.setRoleId(1);
// role.setRoleName("hello");
// roleRepository.save(role);
// Student student = studentRepository.getOne(111);
// List<Role> roles = student.getRoles();
// System.out.println(roles);
}
注意点:
- 维护端和被维护端的选取
- 懒加载
- JoinColumn关联列是否需要插入和更新
- toString的死循环问题
4. Repository 层 实现 Repository 标准
plaintext
1 | @Repository |
5.Repository 的继承关系
- epository:空接口,表名任何继承它的均为仓库接口类
- CrudRepository:继承Repository,实现了一组CRUD相关的方法
- PagingAndSortingRepository:继承CrudRepository,实现了一组分页、排序相关的方法
- JpaRepository:继承PagingAndSortRepository,实现一组JPA规范相关的方法
自定义的XxxRepository需要继承JpaRepository,这样该接口就具备了通用的数据访问控制层的能力。
6.Repository的几种写法
自带的方法
plaintext
1 | List<User> findUserByName(String name); |
使用HSQL
plaintext
1 | /** 2. HQL |
- ?加数字表示占位符,?1代表在方法参数里的第一个参数,区别于其他的index,这里从1开始
- JPQL的语法中,表名的位置对应Entity的名称,字段对应Entity的属性
- :加上变量名,这里是与方法参数中有@Param的值匹配的,而不是与实际参数匹配的
使用 原始 SQL
- 雷同HQL, 在@Query 中 加入 nativeQuery = true
- 注意在修改数据的操作中必须加 @Transactional 事务注解
plaintext
1 | //更新 |
- 数据修改操作需要加上事务注解,保证数据的一致性
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Kid1999' Blog!