例:
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Index;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.MapKeyColumn;
import javax.persistence.Table;
1、@ManyToMany
cascade(级联关系),fetch(加载策略),mappedBy(声明关系的维护方)等属性
带mappedBy的是被维护方
维护端
@ManyToMany (cascade = CascadeType.REFRESH)
@JoinTable (//关联表
name = "student_teacher" , //关联表名
inverseJoinColumns = @JoinColumn (name = "teacher_id" ),//被维护端外键
joinColumns = @JoinColumn (name = "student_id" ))//维护端外键
被维护端
@ManyToMany(
cascade = CascadeType.REFRESH,
mappedBy = "teachers",//通过维护端的属性关联
fetch = FetchType.LAZY)
关系维护端删除时,如果中间表存在些纪录的关联信息,则会删除该关联信息;
关系被维护端删除时,如果中间表存在些纪录的关联信息,则会删除失败 .
Cascade级联:
- CascadeType.PERSIST
级联保存(cascade=CascadeType.PERSIST),此时,若Student实体持有的Course实体在数据库中不存在时,保存该Student时,系统将自动在Course实体对应的数据库中保存这条Course数据。而如果没有这个权限,则无法保存该Course数据。
- CascadeType.REMOVE
Cascade remove operation,级联删除操作。 删除当前实体时,与它有映射关系的实体也会跟着被删除。
- CascadeType.MERGE
Cascade merge operation,级联更新(合并)操作。 当Student中的数据改变,会相应地更新Course中的数据。
- CascadeType.DETACH
Cascade detach operation,级联脱管/游离操作。
如果你要删除一个实体,但是它有外键无法删除,你就需要这个级联权限了。它会撤销所有相关的外键关联。
- CascadeType.REFRESH
Cascade refresh operation,级联刷新操作。 假设场景
有一个订单,订单里面关联了许多商品,这个订单可以被很多人操作,那么这个时候A对此订单和关联的商品进行了修改,与此同时,B也进行了相同的操作,但是B先一步比A保存了数据,那么当A保存数据的时候,就需要先刷新订单信息及关联的商品信息后,再将订单及商品保存。(来自良心会痛的评论)
- CascadeType.ALL
Cascade all operations,清晰明确,拥有以上所有级联操作权限。
fetch加载:
FetchType.LAZY: 懒加载,在访问关联对象的时候加载(即从数据库读入内存)
FetchType.EAGER:立刻加载,在查询主对象的时候同时加载关联对象。
FetchMode可选值意义与区别如下:
@Fetch(FetchMode.JOIN): 始终立刻加载,使用外连(outer
join)查询的同时加载关联对象,忽略FetchType.LAZY设定。@Fetch(FetchMode.SELECT)
:默认懒加载(除非设定关联属性lazy=false),当访问每一个关联对象时加载该对象,会累计产生N+1条sql语句@Fetch(FetchMode.SUBSELECT)
默认懒加载(除非设定关联属性lazy=false),在访问第一个关联对象时加载所有的关联对象。会累计产生两条sql语句。且FetchType设定有效
2、@Table(name="c_auth", indexes= {@Index(name="identity_index", columnList="_identity", unique=true)})
1)、紧接着@Table的name可以不写,默认类名对应数据库,会自动加下划线_
2)、indexes部分就是我们设置索引的地方,@Index是一个具体的索引信息,其中name为索引名,columnList对应数据库的属性名,我这里需要把身份证号设为索引故用“_identity”(身份证),unique为true——不能一样:true
3、@ElementCollection
通用类型的Map映射到数据库
@ElementCollection
@CollectionTable(name="EMP_PHONE")
@MapKeyEnumerated(EnumType.STRING)//Key是枚举时加
@MapKeyColumn(name="PHONE_TYPE")
@Column(name="PHONE_NUM")
private Map<PhoneType, String> phoneNumbers = new HashMap();
@CollectionTable name表示表名
@MapKeyColumn map的key
@Column map的value
4、@JoinColumn 外键
joinColumns = {@JoinColumn(
name = “service_id”)}
5、@MappedSuperclass
这个注解表示在父类上面的,用来标识父类。
基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。例如,数据库表中都需要id来表示编号,id是这些映射实体类的通用的属性,交给jpa统一生成主键id编号,那么使用一个父类来封装这些通用属性,并用@MappedSuperclas标识。
注意:
1.标注为@MappedSuperclass的类将不是一个完整的实体类,他将不会映射到数据库表,但是他的属性都将映射到其子类的数据库字段中。
2.标注为@MappedSuperclass的类不能再标注@Entity或@Table注解,也无需实现序列化接口。
6、@NotNull、@NotEmpty、@NotBlank
String name = null;
@NotNull: false
@NotEmpty: false
@NotBlank: false
String name = “”;
@NotNull: true
@NotEmpty: false
@NotBlank: false
String name = " ";
@NotNull: true
@NotEmpty: true
@NotBlank: false
String name = “Great answer!”;
@NotNull: true
@NotEmpty: true
@NotBlank: true