jpa关联关系注解 入门教程(一)
jpa关联关系注解 入门教程(一)
jpa关联关系注解 入门教程(二)
关联关系注解
关联关系注解包括@JoinColumn、@OneToOne、@OneToMany、@ManyToOne、@ManyToMany、@JoinTable、@OrderBy。
@JoinColumn 定义外键关联的字段名称
(1)源码语法如下:
public @interface JoinColumn {
//目标表的字段名,必填
String name() default "";
//本实体的字段名,非必填,默认是本表ID
String referencedColumnName() default "";
//外键字段是否唯一
boolean unique() default false;
//外键字段是否允许为空
boolean nullable() default true;
//是否跟随一起新增
boolean insertable() default true;
//是否跟随一起更新
boolean updatable() default true;
String columnDefinition() default "";
String table() default "";
ForeignKey foreignKey() default @ForeignKey(ConstraintMode.PROVIDER_DEFAULT);
}
(2)用法:@JoinColumn主要配合@OneToOne、@ManyToOne、@OneToMany一起使用,单独使用没有意义。
(3)@JoinColumns定义多个字段的关联关系。
@OneToOne关联关系
(1)源码语法如下:
public @interface OneToOne {
//关系目标实体,非必填,默认该字段的类型
Class targetEntity() default void.class;
//cascade级联操作策略
1. CascadeType.PERSIST 级联新建
2. CascadeType.REMOVE 级联删除
3. CascadeType.REFRESH 级联刷新
4. CascadeType.MERGE 级联更新
5. CascadeType.ALL 四项全选
6. 默认,关系表不会产生任何影响
CascadeType[] cascade() default {};
//数据获取方式,EAGER(立即加载)/LAZY(延迟加载)
FetchType fetch() default FetchType.EAGER;
//是否允许为空
boolean optional() default true;
//关联关系被谁维护,非必填,一般不需要特别指定 //注意:只有关系维护方才能操作两者的关系,被维护方即使设置了维护方属性进行存储也不会更新外键关联。(1)mappedBy不能与@JoinColumn或者@JoinTable同时使用。(2)mappedBy的值是指另一方的实体里面属性的字段,而不是数据库字段,也不是实体的对象的名字。即另一方配置了@JoinColumn或者@JoinTable注解的属性的字段名称。
String mappedBy() default "";
//是否级联删除,和CascadeType.REMOVE的效果一样,只要配置了两种中的一种就会自动级联删除
boolean orphanRemoval() default false;
}
(2)用法:@OneToOne需要配合@JoinColumn一起使用。注意:可以双向关联,也可以只配置一方,需要视实际需求而定。
【示例】假设一个部门只有一个员工。Department的内容如下:
@OneToOne
@JoinColumn(name="employee_id", referencedColumnName="id")
private Employee employeeAttribute = new Employee() ;
提示
employee_id
指的是Department里面的字段,而
referencedColumnName="id"
指的是Employee表里面的字段。
如果需要双向关联,Employee的内容如下:
@OneToOne(mappedBy="employeeAttribute")
private Department department;
当然也可以不选用mappedBy,和下面效果是一样的:
@OneToOne
@JoinColumn(name="id", referencedColumnName="employee_id")
private Department department;
@OneToMany与@ManyToOne关联关系
@OneToMany与@ManyToOne可以相对存在,也可只存在一方。
(1)@OneToMany和@ManyToOne源码语法如下:
public @interface OneToMany {
Class targetEntity() default void.class;
//cascade级联操作策略
CascadeType[] cascade() default {};
//数据获取方式,EAGER(立即加载)/LAZY(延迟加载)
FetchType fetch() default FetchType.LAZY;
//关联关系被谁维护,单向的。注意:只有关系维护方才能操作两者的关系
String mappedBy() default "";
//是否级联删除,和CascadeType.REMOVE的效果一样,只要配置了两种中的一种就会自动级联删除
boolean orphanRemoval() default false;
}
public @interface ManyToOne {
Class targetEntity() default void.class;
CascadeType[] cascade() default {};
FetchType fetch() default FetchType.EAGER;
boolean optional() default true;
}
@ManyToOne与OneToMany的源码稍有区别,仔细体会。
(2)使用示例,必须和@JoinColumn配合使用才有效。
// 用户表
@Entity
@Table(name="user")
public class User implements Serializable{
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY,mappedBy="user")
private Set<role> setRole;
...
}
// 角色表
@Entity
@Table(name="role")
public class Role {
@ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinColumn(name="user_id")//user_id字段作为外键
private User user;
...
}