此篇记录大部分自己学习中用到的Spring data 注解,附带记录了一些业务中经常用到的其他注解
类注解
作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。
写法将此标签加在model 类的类名上 ,可以多个属性也可以单个属性。
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的时候,需要忽略的属性。
当然价格依赖也能解决
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
<version>2.9.0</version>
</dependency>
参考:https://www.jianshu.com/p/106e98dd592f
类注解
lombok 的注解,自动生成Getter,Setter,toString,构造函数等,idea中需要下载插件。
类注解
在进行实体类的封装时,id、状态、时间等,这些实体类重复的公共属性可以声明一个超类统一进行设置,加上@MappedSuperclass注解,然后实体类继承即可。
@MappedSuperclass标识的类表示其不能映射到数据库表,因为其不是一个完整的实体类,但是它所拥有的属性能够隐射在其子类对用的数据库表中
@MappedSuperclass标识得嘞不能再有@Entity或@Table注解
实例如下:
@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;
}
声明该属性与数据库字段的映射关系。
注意:
1、 当POJO有属性不需要映射的时候一定要用@Transitent修饰,该注释表示此属性与表没有映射关系,只是一个暂时的属性。
2、 @Lob注释表示该属性持久化为Blob或者Clob类型,具体取决于属性的类型。
用于标注主键的生成策略,通过strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer对应identity,MySQL 对应 auto increment。
在javax.persistence.GenerationType中定义了以下几种可供选择的策略:
@PrePersist
public void prePersist() {
createdAt = updatedAt = new Date();
status = true;
}
@PreUpdate
public void preUpdate() {
if (createdAt == null) {
createdAt = new Date();
}
updatedAt = new Date();
}
来源:https://www.erlo.vip/share/9/5086.html
来源:https://www.erlo.vip/share/9/5086.html
@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,提供一个全参的构造方法。
来源:https://www.erlo.vip/share/9/5086.html
由于项目时间紧张,关于JPA的注解和使用就先记录到这里,有待以后补充。