前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring data 相关注解

Spring data 相关注解

作者头像
吐吐吐吐吐葡萄皮
发布2019-04-04 15:05:23
2K0
发布2019-04-04 15:05:23
举报
文章被收录于专栏:ai_houziai_houzi

此篇记录大部分自己学习中用到的Spring data 注解,附带记录了一些业务中经常用到的其他注解


@JsonIgnoreProperties

类注解

作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。

写法将此标签加在model 类的类名上 ,可以多个属性也可以单个属性。

代码语言:javascript
复制
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler","username"})
@Data
public class Base{
    private String username;
    private String password;
}

关于hibernateLazyInitializer和handler:

hibernate加载策略设置为lazy时,可以在使用的时候加载相应的数据,但会绑定一个类,在转换json时,需要将此类屏蔽。jsonplugin通过java的反射机制将pojo转换成json,会把hibernateLazyInitializer也拿出来操作,但是hibernateLazyInitializer无法由反射得到,这样使用会抛异常。 所以需要在实体类上通过@JsonIgnoreProperties注解告诉jsonplugin,对象转json的时候,需要忽略的属性。

当然价格依赖也能解决

代码语言:javascript
复制
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>2.9.0</version>
</dependency>

参考:https://www.jianshu.com/p/106e98dd592f


@Data

类注解

lombok 的注解,自动生成Getter,Setter,toString,构造函数等,idea中需要下载插件。


@MappedSuperclass

类注解

在进行实体类的封装时,id、状态、时间等,这些实体类重复的公共属性可以声明一个超类统一进行设置,加上@MappedSuperclass注解,然后实体类继承即可。

@MappedSuperclass标识的类表示其不能映射到数据库表,因为其不是一个完整的实体类,但是它所拥有的属性能够隐射在其子类对用的数据库表中

@MappedSuperclass标识得嘞不能再有@Entity或@Table注解

实例如下:

代码语言:javascript
复制
@MappedSuperclass
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public abstract class BaseClass implements Comparable<BaseEntity>, Serializable {
    @Id //用于标记属性的主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id") //声明该属性与数据库字段的映射关系。
    private Long id;

    @ApiModelProperty(value = "创建时间")
    @Column
    protected Date createdAt;
}

@Entity //对实体注释。任何Hibernate映射对象都要有这个注释
public class child extends BaseClass{
    private String username;
    private String password;
}

@Column

声明该属性与数据库字段的映射关系。

注意:

代码语言:javascript
复制
1、  当POJO有属性不需要映射的时候一定要用@Transitent修饰,该注释表示此属性与表没有映射关系,只是一个暂时的属性。

2、  @Lob注释表示该属性持久化为Blob或者Clob类型,具体取决于属性的类型。

@GeneratedValue

用于标注主键的生成策略,通过strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer对应identity,MySQL 对应 auto increment。

在javax.persistence.GenerationType中定义了以下几种可供选择的策略:

  • IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle 不支持这种方式;
  • AUTO: JPA自动选择合适的策略,是默认选项;
  • SEQUENCE:通过序列产生主键,通过@SequenceGenerator 注解指定序列名,MySql不支持这种方式
  • TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。

@PreUpdate

代码语言:javascript
复制
@PrePersist
public void prePersist() {
    createdAt = updatedAt = new Date();
    status = true;
}

@PreUpdate
public void preUpdate() {
    if (createdAt == null) {
        createdAt = new Date();
    }
    updatedAt = new Date();
}
  • 用于为相应的生命周期事件指定回调方法。
  • 该注释可以应用于实体类,映射超类或回调监听器类的方法。
  • 用于setter 如果要每次更新实体时更新实体的属性,可以使用@PreUpdate注释。
  • 使用该注释,您不必在每次更新用户实体时显式更新相应的属性。
  • preUpdate不允许您更改您的实体。 您只能使用传递给事件的计算的更改集来修改原始字段值。

来源:https://www.erlo.vip/share/9/5086.html


@Prepersist

  • 查看@PrePersist注释,帮助您在持久化之前自动填充实体属性。
  • 可以用来在使用jpa的时记录一些业务无关的字段,比如最后更新时间等等。生命周期方法注解(delete没有生命周期事件)
  • @PrePersist save之前被调用,它可以返回一个DBObject代替一个空的 @PostPersist save到datastore之后被调用
  • @PostLoad 在Entity被映射之后被调用 @EntityListeners 指定外部生命周期事件实现类

来源:https://www.erlo.vip/share/9/5086.html


@PostLoad

  • 执行 EntityManager.find()或 getreference()方法载入一个实体后;
  • 执行 JPA QL 查询过后;
  • EntityManager.refresh( )方法被调用后。

@PrePersist 和 @PostPersist事件在实体对象插入到数据库的过程中发生; @PrePersist 事件在调用 EntityManager.persist()方法后立刻发生,级联保存也会发生此事件,此时的数据还没有真实插入进数据库。 @PostPersist 事件在数据已经插入进数据库后发生。 @PreUpdate 和 @PostUpdate 事件的触发由更新实体引起, @PreUpdate 事件在实体的状态同步到数据库之前触发,此时的数据还没有真实更新到数据库。 @PostUpdate 事件在实体的状态同步到数据库后触发,同步在事务提交时发生。 @PreRemove 和 @PostRemove 事件的触发由删除实体引起,@ PreRemove 事件在实体从数据库删除之前触发,即调用了 EntityManager.remove()方法或者级联删除

当你在执行各种持久化方法的时候,实体的状态会随之改变,状态的改变会引发不同的生命周期事件。这些事件可以使用不同的注释符来指示发生时的回调函数。

@javax.persistence.PostLoad:加载后。

@javax.persistence.PrePersist:持久化前。

@javax.persistence.PostPersist:持久化后。

@javax.persistence.PreUpdate:更新前。

@javax.persistence.PostUpdate:更新后。

@javax.persistence.PreRemove:删除前。

@javax.persistence.PostRemove:删除后。

1)数据库查询

@PostLoad事件在下列情况下触发:

执行EntityManager.find()或getreference()方法载入一个实体后。

执行JPQL查询后。

EntityManager.refresh()方法被调用后。

2)数据库插入

@PrePersist和@PostPersist事件在实体对象插入到数据库的过程中发生:

@PrePersist事件在调用persist()方法后立刻发生,此时的数据还没有真正插入进数据库。

@PostPersist事件在数据已经插入进数据库后发生。

3)数据库更新

@PreUpdate和@PostUpdate事件的触发由更新实体引起:

@PreUpdate事件在实体的状态同步到数据库之前触发,此时的数据还没有真正更新到数据库。

@PostUpdate事件在实体的状态同步到数据库之后触发,同步在事务提交时发生。

4)数据库删除

@PreRemove和@PostRemove事件的触发由删除实体引起:

@PreRemove事件在实体从数据库删除之前触发,即在调用remove()方法删除时发生,此时的数据还没有真正从数据库中删除。

@PostRemove事件在实体从数据库中删除后触发。

@NoArgsConstructor & @AllArgsConstructor(lombok)

@NoArgsConstructor,提供一个无参的构造方法。

@AllArgsConstructor,提供一个全参的构造方法。

来源:https://www.erlo.vip/share/9/5086.html

由于项目时间紧张,关于JPA的注解和使用就先记录到这里,有待以后补充。


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • @JsonIgnoreProperties
  • @Data
  • @MappedSuperclass
  • @Column
  • @GeneratedValue
  • @PreUpdate
  • @Prepersist
  • @PostLoad
    • @NoArgsConstructor & @AllArgsConstructor(lombok)
    相关产品与服务
    数据库
    云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档