@CreationTimestamp 注解是放在JPA的实体类上的
会生成一个默认的一个时间戳
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)这个会联级保存关系
@NotAudited 这个不会保存联级关系
@embeddable是注释Java类的,表示类是嵌入类。
@embedded是注释属性的,表示该属性的类是嵌入类。
例子:
@Embeddable @Access(AccessType.FIELD)
public class Address {
private String street;
private String city;
private String state;
@Column(name="ZIP_CODE")
private String zip;
// ...
}
@Entity
public class Employee {
@Id private int id;
private String name;
private long salary;
@Embedded private Address address;
// ...
}
@deprecated的程序元素是不鼓励程序员使用的元素,通常是因为它是危险的,或者是因为存在更好的替代方案。编译器在非弃用代码中使用或重写预先指定的程序元素时发出警告。
不建议使用@deprecated标注过的类或方法。
@Access批注,有两种模式包括:
AccessType.FIELD;
AccessType.PROPERTY,
这两个类型定义了实体的访问模式(Access mode)。
通过字段来获取或设置实体的状态,getter和setter方法可能存在或不存在。这样JPA默认的访问类型为AccessType.FIELD
持久化属性必须有getter和setter方法,属性的类型由getter方法的返回类型决定,同时必须与传递到setter方法的单个参数的类型相同。这样JPA默认的访问类型为AccessType.PROPERTY
@Transient(临时的)。(使其不会被正常的访问模式持久化)
JPA 中查询的时候加了@param 和没有加的区别:
@Modifying(clearAutomatically=true):
@Query注解只有对数据查询的操作,如果你需要进行对数据的修改那就必须使用@Modifying注解。
点击@Modifying,进入这个注解,我们能看到,有两个方法
flushAutomatically() default false;
clearAutomatically() default false;
它是指可以清除底层持久化上下文,即entityManager这个类;Jpa底层实现会有一级缓存,也就是在更新完数据库后,如果后面去用这个对象,你再去查这个对象,这个对象是在一级缓存,但是并没有跟数据库同步,
使用clearAutomatically=true,就会刷新Hibernate的一级缓存, 否则在同一接口中,更新一个对象,接着查询这个对象,那么查出来的这个对象还是之前的没有更新前的状态。
使用flushAutomatically=true 为,在执行修改之后,没有使用flush 的话执行clearAutomatically=true 可能会导致修改的数据丢失。
@Modifying 的 clearAutomatically 属性为 true 时,执行完 modifying query 之后就会清理缓存。
自动清理之后还会带来一个新的问题,clear 操作清理的缓存中,还包括提交后未 flush 的数据,例如调用 save 而不是 saveAndFlush 就有可能不会立即将修改内容更新到数据库中,在 save 之后 flush 之前调用 @Modifying(clearAutomatically = true) 修饰的方法就有可能导致修改丢失。如果再要解决这个问题,还可以再加上另外一个属性 @Modifying(clearAutomatically = true, flushAutomatically = true),@Modifying 的 flushAutomatically 属性为 true 时,执行 modifying query 之前会先调用 flush 操作,从而避免数据丢失问题。