前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JPA使用-实体类上常用注解

JPA使用-实体类上常用注解

作者头像
小码农薛尧
发布2019-12-19 19:41:41
1.8K0
发布2019-12-19 19:41:41
举报

@SQLDelete

场景描述

JPA中提供了简单的CRUD操作,其中删除操作是物理删除,但是实际应用中,系统中的数据是一种资源,不能直接删除,应该做到逻辑删除,JPA中删除操作是不可取的。

场景示例

调用JPA的删除方法,如下代码所示:

@Testpublic void testJpaDelete() {  //此处根据id删除角色信息  roleRepository.deleteById(1);}

执行上面的测试方法,数据表中主键为1的数据,已经被删除掉,看下JPA的执行SQL如下所示:

delete from role where id=?

此语句为JPA删除操作的默认执行语句。

解决方案

JPA的默认删除方法,并不可取,可以在Role实体上加上@SQLDelete注解,并写SQL语句,如下所示:

@SQLDelete(sql = "update role set is_deleted = 1 where id = ?")

上面的注解代表着,只要执行JPA的删除操作,执行的SQL语句为我们自己定义的SQL语句。

测试一下
 @Testpublic void testJpaDelete() {  roleRepository.deleteById(2);}

结果打印的SQL执行语句,如下所示

update role set is_deleted = 1 where id = ?

@DynamicInsert

场景描述

在JPA中添加/更新都是使用save()方法,一般情况下,创建数据表的时候,会给某些字段设置默认的值,避免在插入的时候手动赋值,如创建时间,是否删除等等。

save方法会把没有值的对象,默认赋空值,造成,原数据表的默认值失效。

场景示例

添加一个角色,如下所求

@Testpublic void testJpaAdd() {  Role role = new Role();  role.setRoleName("小码农薛尧");  roleRepository.save(role);}

RoleAddDto对象

/** * @description: * @author: Simon.Xue * @date: 2019-02-17 22:15 **/@Datapublic class RoleAddDto implements Serializable {    /**     * 角色名     */    private String roleName;}

Role数据表的结构为

create table role(  id int not null auto_increment,  role_name varchar(32) not null comment '角色名',  create_time timestamp default current_timestamp comment '创建时间',  update_time timestamp default current_timestamp on update current_timestamp comment '更新时间',  is_deleted int default 0 comment '是否删除',  primary key (id)) character set utf8mb4  comment '角色表';

从上面数据表的定义语句,我们可以看出来,是否删除是有默认值0的,但是我们实现执行后的结果为

附:执行sql语句如下

insert into role (create_time, is_deleted, role_name, update_time) values (?, ?, ?, ?)

解决方案

在Role实体类上加上@DynamicUpdate注解,告诉JPA没有值的属性不用赋NULL值,重新添加角色如下图所示

附:执行sql语句如下

insert into role (role_name) values (?)

@DynamicUpdate

场景描述

在JPA的使用过程中,我们常遇到更新数据库中记录的数据,一般情况下,我们只会把更新的值传给save()方法,但是该方法会把没有更新的值全部覆盖掉。

场景示例

更新上个例子中id为8的数据,把角色名改成小明的秘密,如下所示

@Testpublic void testJpaUpdate() {  Role role = new Role();  role.setId(8);  role.setRoleName("小明的秘密");  roleRepository.save(role);}

上面第8条数据更新后,is_deleted的值被赋值为NULL

附:执行sql的语句如下:

update role set create_time=?, is_deleted=?, role_name=?, update_time=? where id=?

解决方案

在Role实体上添加@DynamicUpdate注解,重新更新第8条记录,执行的sql语句如下

update role set create_time=?, update_time=? where id=?

@ Where

场景描述

一般情况下,查询语句都是要带上查询条件,如过滤掉删除的数据,把没有删除的数据查询出来,但是JPA默认是没有带有任何条件。

解决方案

在实体上添加@Where注解,如下所示

@Data@Table(name = "role")@SQLDelete(sql = "update role set is_deleted = 1 where id = ?")@Entity@Accessors(chain = true)@DynamicInsert@DynamicUpdate@Where(clause = "is_deleted = 0")public class Role implements Serializable {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Integer id;
    private String roleName;
    private LocalDateTime createTime;    private LocalDateTime updateTime;    private Integer isDeleted;}

只要JPA调用任何Role的查询条件都会默认带上is_deleted = 0,如下图所示

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小码农薛尧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • @SQLDelete
    • 场景描述
      • 场景示例
        • 解决方案
          • 测试一下
      • @DynamicInsert
        • 场景描述
          • 场景示例
            • 解决方案
            • @DynamicUpdate
              • 场景描述
                • 场景示例
                  • 解决方案
                  • @ Where
                    • 场景描述
                      • 解决方案
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档