JPA @Column,@SQLDelete,@Lob注解用法

目录

@Column

@SQLDelete

@Lob


@Column

转载自:JPA @Column 注解 | 範宗雲 (fanlychie.github.io)

@Column 是属性或方法级别的注解,用于指定持久化属性映射到数据库表的列。如果没有指定列注释,则使用其默认值。

参数类型描述
nameString列的名称,默认为属性的名称(Hibernate 映射列时,若遇到驼峰拼写,会自动添加 _ 连接并将大写字母改成小写)。
uniqueboolean列的值是否是唯一的。这是 @UniqueConstraint 注解的一个快捷方式, 实质上是在声明唯一约束。默认值为 false。
nullableboolean列的值是否允许为 null。默认为 true。
insertableboolean列是否包含在 INSERT 语句中,默认为 true。
updatableboolean列是否包含在 UPDATE 语句中,默认为 true。
columnDefinitionString生成列的 DDL 时使用的 SQL 片段。默认使用推断的类型来生成 SQL 片段以创建此列。
tableString当前列所属的表的名称。
lengthint列的长度,仅对字符串类型的列生效。默认为255。
precisionint列的精度,仅对十进制数值有效,表示有效数值的总位数。默认为0。
scaleint列的精度,仅对十进制数值有效,表示小数位的总位数。默认为0。

  1. 示例

@Entity(name = "person")
public class Person implements Serializable {
    
    @Id
    @GeneratedValue
    private Long id;
    
    @Column(nullable = false, length = 32)
    private String name;
    
    @Column(length = 128)
    private String mail;
    
    @Column(columnDefinition = "char(11) NOT NULL")
    private String phone;
    
    @Column(precision = 5, scale = 2)
    private BigDecimal salary;
    
    @Column(precision = 5, scale = 2)
    private double assets;
    
    // getters and setters
    
}

产生的 DDL 语句(MySQL):

CREATE TABLE `person` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `assets` double NOT NULL,
  `mail` varchar(128) DEFAULT NULL,
  `name` varchar(32) NOT NULL,
  `phone` char(11) NOT NULL,
  `salary` decimal(5,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

可以看出,salary 字段的精度控制生效了,但对于 double 类型的 assets 字段的精度控制没有生效,为了使其生效,将代码修改为:

@Column(columnDefinition = "double(5, 2)")
private double assets;

产生的 DDL 语句(MySQL):

CREATE TABLE `person` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `assets` double(5,2) DEFAULT NULL,
  `mail` varchar(128) DEFAULT NULL,
  `name` varchar(32) NOT NULL,
  `phone` char(11) NOT NULL,
  `salary` decimal(5,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

@SQLDelete

参考:JPA使用-实体类上常用注解 - 云+社区 - 腾讯云 (tencent.com)

场景描述

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 = ?

@Lob

参考:java - What is the significance of @javax.persistence.Lob annotation in JPA? - Stack Overflow

@javax.persistence.Lob signifies that the annotated field should be represented as BLOB (binary data) in the DataBase.

You can annotate any Serializable data type with this annotation. In JPA, upon persisting (retrieval) the field content will be serialized (deserialized) using standard Java serialization.

Common use of @Lob is to annotate a HashMap field inside your Entity to store some of the object properties which are not mapped into DB columns. That way all the unmapped values can be stored in the DB in one column in their binarry representation. Of course the price that is paid is that, as they are stored in binary format, they are not searchable using the JPQL/SQL.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值