美文网首页
SpringData JPA 使用笔记

SpringData JPA 使用笔记

作者: 超级笔记本 | 来源:发表于2019-09-30 13:33 被阅读0次

一、实体类

1、注解

@Entity

表明是实体类

@Table(name = "自定义的表名")

自定义表名,不写则是类名

@Id

把这个类里面所在的变量设置为主键Id。

@GeneratedValue(strategy = GenerationType.IDENTITY)

主键生成策略,strategy :
-AUTO主键由程序控制
-IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式
-SEQUENCE 通过数据库的序列产生主键, MYSQL 不支持
-Table 使用一个特定的数据库表格来保存主键

@Basic

表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxxx()方法,默认即为@Basic
fetch:表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载,默认为EAGER。

@Column(name = "自定义字段名",length = "自定义长度",nullable = "是否可以空",unique = "是否唯一",columnDefinition = "自定义该字段的类型和长度")
@Transient

表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性. 如果一个属性并非数据库表的字段映射,就务必将其标示为 @Transient ,否则,ORM框架默认其注 解为 @Basic

@Entity
@Table(name = "jpa_poem")
public class JpaPoem extends VenusModel {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Basic
    @Column(name = "type")
    private Integer type;

    @Basic
    @Column(name = "title")
    private String title;

    @Basic
    @Column(name = "content")
    private String content;

    @Basic
    @Column(name = "author")
    private String author;

    @Transient
    private Integer age;
    //get、set
}

二、Repository接口层

核心知识:SpringData Repository 接口

CrudRepository 接口提供了最基本的对实体类的添删改查操作

-T save(T entity); //保存单个实体
-T findOne(ID id); // 根据id查找实体
-void delete(ID/T/Iterable); // 根据Id删除实体,删除实体,批量删除

PagingAndSortingRepository 提供了分页与排序功能

-<T, ID extends Serializable> // 第一个参数传实体类,第二个参数传注解数据类型
-Iterable<T> findAll(Sort sort); // 排序
-Page<T> findAll(Pageable pageable); // 分页查询(含排序功能)

JpaSpecificationExecutor 提供了Specification(封装 JPA Criteria查询条件)的查询功能

-List<T> findAll(Specification<T> spec);
-Page<T> findAll(Specification<T> spec, Pageable pageable);
-List<T> findAll(Specification<T> spec, Sort sort);

开发建议

  1. 这里只列出的是常用方法
  2. CrudRepository 中的findAll() 方法要慎用。当数据库中数据量大,多线程脚本调用findAll方法,系统可能会宕机。
  3. CrudRepository 中的deletAll()方法要慎用。这是物理删除,现在企业一般采用逻辑删除。
  4. PagingAndSortingRepository 和 JpaSpecificationExecutor 能满足大部分业务需求。
public interface UserRepository extends PagingAndSortingRepository<User, Long>, 
    JpaSpecificationExecutor<User>{
  
    // 1 通过账号查用户信息
    User findByAccount(String account);
    // 2 获取指定时间内以xx邮箱结尾的用户信息
    List<User> findByEmailEndingWithAndCreatedDateLessThan(String email, String createdDate);

  
    // 3 获取某平台活跃用户数量
    @Query(value="SELECT count(u.id) FROM User u WHERE u.platform = :platform AND u.updatedDate <= :updatedDate")
    long getActiveUserCount(@Param("platform")String platform, @Param("updatedDate")String updatedDate);
    
    // 4 通过邮箱或者手机号模糊查询用户信息
    @Query(value="SELECT u FROM User u WHERE u.email LIKE %?1% OR u.iphone LIKE %?2%")
    List<User> findByEmailAndIhpneLike(String email, String iphone);
    
    // 5 修改用户邮箱
    @Modifying
    @Query("UPDATE User u SET u.email = :email WHERE u.id = :id")
    void updateUserEmail(@Param("id") Long id, @Param("email") String email);

       // 6 传入的值是对象
       @Modifying
       @Query("update Variable v set v.lastSavedValue =:#{#variable.lastSavedValue}, v.lastSavedValueTime =:#{#variable.lastSavedValueTime} where v.id=:#{#variable.id}")
       Variable updateVariableValue(Variable: variable);
    
}
关键字
806956-20171216201221139-477023651.png

二、@Transactional不起作用如何排查问题

1、首先要看数据库本身对应的库、表所设置的引擎是什么。MyIsam不支持事务,如果需要,则必须改为InnnoDB。

2、@Transactional所注解的方法是否为public

3、@Transactional所注解的方法所在的类,是否已经被注解@Service或@Component等。

4、需要调用该方法,且需要支持事务特性的调用方是在在 @Transactional所在的类的外面。注意:类内部的其他方法调用这个注解了@Transactional的方法,事务是不会起作用的。

5、注解为事务范围的方法中,事务的回滚仅仅对于unchecked的异常有效。对于checked异常无效。也就是说事务回滚仅仅发生在出现RuntimeException或Error的时候。

如果希望一般的异常也能触发事务回滚,需要在注解了@Transactional的方法上,将@Transactional回滚参数设为:

@Transactional(rollbackFor=Exception.class)

6、springboot项目有两个可选配置,默认已经支持事务了,可以写也可以不写。

(1)springboot启动类,即程序入口类,需要注解@EnableTransactionManagement

@EnableTransactionManagement
@SpringBootApplication
public class PetsApplication {

    public static void main(String[] args) {
        SpringApplication.run(PetsApplication.class, args);
    }
}

(2)springboot配置文件application.yml中,可以配置上失败回滚:

spring:
  profiles:
    active: prod
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/spbdb
    username: root
    password:
  jpa:
    hibernate:
      ddl-auto:
    show-sql: true
  transaction:
    rollback-on-commit-failure: true
问题纪录

1、利用sql语句修改和删除时,需要添加 @Modifying ,在Service层添加 @Transactional 注解
2、deleteAll()之后
参考文章(https://www.cnblogs.com/itdragon/p/8047132.html
)

相关文章

  • SpringData JPA 使用笔记

    一、实体类 1、注解 @Entity 表明是实体类 @Table(name = "自定义的表名") 自定义表名,不...

  • Spring Data JPA

    Spring Data JPA,一种动态条件查询的写法 我们在使用SpringData JPA框架时,进行条件查询...

  • Spring Data下---Spring Data JPA的使

    Spring Data下---Spring Data JPA的使用 一、SpringData的环境搭建 依赖添加:...

  • 学习笔记

    1. SpringData JPA只是SpringData中的一个子模块。JPA是一套标准接口,而Hibernat...

  • springdata JPA使用教程

    Criteria查询 这是springdata中最强大,最灵活的使用方式了,几乎可以满足所有的查询场景。用法如下:...

  • 7 Spring-data-jpa查询方法

    springdata-jpa 八种查询方法 Spring Data JPA 简单查询--接口方法 jpa动态查询-...

  • Spring Data JPA入门

    [TOC] SpringData JPA是spring基于ORM框架、JPA规范的基础上封装的一套JPA应用框架,...

  • SpringData JPA

    一、概述 1. SpringData 概述 Spring Data : Spring 的一个子项目。用于简化数据库...

  • springdata jpa

  • SpringBoot项目使用Jpa时设置spring.jpa.h

    前言 问题描述 在springboot项目中使用springdata Jpa,并且希望当我的实体类发生了更改,数据...

网友评论

      本文标题:SpringData JPA 使用笔记

      本文链接:https://www.haomeiwen.com/subject/ivnxuctx.html