JPA注解

例:
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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值