当前位置: 首页 > news >正文

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;
	...
}

相关文章:

  • jpa关联关系注解 入门教程(二)
  • springboot 将对象装换为map
  • springboot 将map装换为java对象
  • json header
  • js split console.log() 不生效的原因之一
  • js 以逗号分隔的数字字符串分割成数字数组
  • element多选框checkbox对后台数据进行回显(显示被选中状态)
  • checkbox获得已选的数字集合而不是文字集合
  • java 对string list进行join拼接操作
  • string数组转int数组 java
  • java 将以逗号分割的数字字符串转为数字列表
  • Spring Data Specifications入门教程
  • Job for docker.service failed because the control process exited with error
  • 在虚拟机配置docker redis环境
  • JPA CrudRepository方法详解
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • #Java异常处理
  • 【css3】浏览器内核及其兼容性
  • 【个人向】《HTTP图解》阅后小结
  • Angular 响应式表单之下拉框
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 翻译--Thinking in React
  • 力扣(LeetCode)56
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 面试遇到的一些题
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 微信小程序--------语音识别(前端自己也能玩)
  • 为视图添加丝滑的水波纹
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • #pragma once与条件编译
  • (1)(1.11) SiK Radio v2(一)
  • (2022 CVPR) Unbiased Teacher v2
  • (C++17) std算法之执行策略 execution
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转)重识new
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core Swagger 过滤部分Api
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .net中我喜欢的两种验证码
  • @Autowired多个相同类型bean装配问题
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @private @protected @public
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [Android]竖直滑动选择器WheelView的实现
  • [Android]通过PhoneLookup读取所有电话号码
  • [Git 1]基本操作与协同开发