JPA配置
spring:jpa:hibernate:ddl-auto: update#显示SQL语句show-sql: true#sql格式化显示properties:hibernate:format_sql: true
使用JPA注解定义实体类
@Entity @Table @Id @Colum @GeneratedValue
等
@GeneratedValue , steategy=
GenerationType.AUTO,由程序自动选择主键生成策略
GenerationType.IDENTITY,自增,MySQL
GenerationType.TABLE,jpa提供的一种机制,通过一张数据库表的形式帮助我们完成主键
GenerationType.SEQUENCE,自增,Oracle
实体类的属性和关系映射
一对一
@OneToOne(mappedBy="另一方关联属性名,将外键约束指执行交给另一方维护",cascade=CasecadeType.PERSIST)
一对一映射关系,type:
ALL, 所有持久化操作
PERSIST, 插入操作时执行关联操作
MERGE, 修改操作时执行关联操作
REMOVE, 删除操作时执行关联操作
@JoinColumn(name="waijian_id")
设置外键
一对多
@OneToMany
一对多映射关系
@JoinColumn(name="waijian_id")
设置外键
多对多
@ManyToMany
一对多映射关系
@JoinTable(name="TB_USER_ROLE", joinColumns={@joinColumn(name="U_ID")}, inverseJoinColumns={@joinColumn(name="R_ID")})
设置外键
JPA内置操作数据库
查询:findAll(),findById(),findOne(),getById() ......
新增:save()
更新:无
删除:delete()......
如何自定义操作数据库方法
当 JPA 自带的功能满足不了我们的需求,也可以自定义的 SQL 来查询。自定在查询方法使用@Query
,自定义删除修改方法需要@Query``@Modifying
一起使用,还需要在业务逻辑层支持事务@Transactional
。
nativeQuery=true,表示使用原生SQL
@Query(value = "update User u set u.userName = ?1 where u.id = ?2",nativeQuery=true)
1,支持JPQL(Java持久性查询语言)和原生SQL
2,规范方法名,就可以不用写JPQL或原生SQL(前缀_By_对象属性,支持查询和删除操作)
3,Query by Example,用于动态查询(缺点较复杂 ),只支持查询操作。不支持嵌套或分组的属性约束,只支持字符串 start/contains/ends/regex匹配和其他属性类型的精确匹配。
4,通过Specifications,支持更灵活的动态查询
5,通过QueryDSL第三方框架实现动态查询,JPAQueryFactory
构建查询条件
JPA的事务管理
事务的七种传播行为:
REQUIRED
,spring默认,依赖于外部事务的存在,如果外部没有事务则创建一个新事务;
REQUIRES_NEW
,始终开启一个新事务;
SUPPORTS
,支持以当前事务方式运行,如果当前不存在事务,则会以非事务方式执行;
`NOT__SUPPORTED,以非事务方式运行;
MANDATOR
Y,必须在一个已存在的事务中执行,否则会抛出异常;
NEVER
,不允许方法在事务中运行,否则抛出异常;
NESTED
,以嵌套事务方式运行;
事务的四种隔离级别:
未提交读【脏读问题】
已提交读【不可重复读问题】
可重复读【幻读问题】
可串行化【最高隔离级别】
如何优化数据库性能
索引、合理设计数据库表结构
待完善......
JPA的缓存机制、如何配置和使用JPA的缓存
待完善......
JPA乐观锁
private @Version Long version 乐观锁,自动加字段,每次修改版本加一
JPA审计功能, Auditing
实体类注解
@CreatedBy
创建人
@CreatedDate
创建时间
@LastModifiedBy
最后修改人
@LastModifiedDate
最后修改时间
@Temporal
保存时间类型
配置类
@EnableJpaAuditing
实现 AuditorAware<T>
接口,重写 getCurrentAuditor()
,设置当前用户
实体类中还需要要声明 @EntityListeners(AuditingEntityListener.class)