一、实体类
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);
开发建议
- 这里只列出的是常用方法
- CrudRepository 中的findAll() 方法要慎用。当数据库中数据量大,多线程脚本调用findAll方法,系统可能会宕机。
- CrudRepository 中的deletAll()方法要慎用。这是物理删除,现在企业一般采用逻辑删除。
- 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);
}
关键字

二、@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
)
网友评论