JPA中@OneToOne 与 @OneToMany 的用法
Spring工程中,创建实体对象时,可以通过JPA的@Entity标识实体与数据库表的对应关系,@Column标识数据库字段。其中还有标识两个实体间关系的注解:@OneToOne、@OneToMany、@ManyToOne和@ManyToMany,分别标识一对一、一对多、多对一和多对多。在此,简单记录下@OneToOne和@OneToMany的使用。其中还会涉及注解@JoinColumn,其修饰的字段为关系维护字段。
@OneToOne
@OneToOne与@JoinColumn结合使用,表示会在源实体(Source Entity,即声明该注解的实体类中创建外键,进行级联),以ShipOrderInfo和ShipOrderRecords为例。
- ShipOrderInfo类,会在ship_order_info表中创建ship_order_records的外键;
- ShipOrderRecords类,mappedBy = "shipOrderInfo",表示由ShipOrderInfo类的shipOrderRecordsList维护外键;
- 保存ShipOrderInfo对象的时候,会先将ShipOrderRecords对象保存,然后设置ShipOrderInfo对象外键,并保存。即先保存targetEntity,设置外键后,再保存sourceEntity。
@OneToMany
@OneToMany与@JoinColumn结合使用,会在目标实体(targetEntity指定的类中创建外键)。保存的时候,先保存sourceEntity,设置外键后,再保存targetEntity。如ShipOrderRecords 和 ShipOrdedLogs是一对多的情况。
@Data
@Entity(name = "ShipOrderInfo")
@Table(name = "ship_order_info")
public class ShipOrderInfo extends AuditModel implements Serializable {private static final long serialVersionUID = -3984010638987217501L;@Id@GeneratedValue(strategy = GenerationType.AUTO,generator = "pg-uuid")@GenericGenerator(name = "pg-uuid",strategy = "uuid2",parameters = @org.hibernate.annotations.Parameter(name = "uuid_gen_strategy_class",value = "com.decathlon.shiphub.common.util.PostgreSQLUUIDGenerationStrategy"))@Column(name = "id", columnDefinition = "uuid default uuid_generate_v4()")private UUID id;@Column(name = "ship_group_id")@NotEmpty(message = "ship_group_id must not be empty")private String shipGroupId;@Column(name = "order_id")private String orderId;@Column(name = "tracking_number")private String trackingNumber;@Column(name = "estimated_delivery_time", columnDefinition = "timestamptz")private Instant estimatedDeliveryTime;@Column(name = "real_delivery_time", columnDefinition = "timestamptz")private Instant realDeliveryTime;@Column(name = "order_paytime", columnDefinition = "timestamptz")private Instant orderPaytime;@Column(name = "sports_user_id")private String sportsUserId;@Column(name = "client_channel")private Integer clientChannel;@Column(name = "label_url")private String labelURL;@Column(name = "b2c_order_id")private String b2cOrderId;@Column(name = "order_latest_status")private Integer orderLatestStatus;@Column(name = "data_status", columnDefinition = "int2 default 0")private Byte dataStatus;@Column(name = "carrier_id")private UUID carrierId;@Column(name = "location_info_id")private UUID locationInfoId;@Column(name = "delivery_type")private String deliveryType;@Column(name = "contact_phone")private String contactPhone;@Column(name = "order_platform")private String orderPlatform;@Column(name = "click_collect_destination")private String clickCollectDestination;@Column(name = "order_sequence")private String orderSequence;@OneToOne(mappedBy = "shipOrderInfo", cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)@JsonManagedReferenceprivate List<ShipOrderRecords> shipOrderRecordsList;
}
@Data
@Entity(name = "ShipOrderRecords")
@Table(name = "ship_order_records")
public class ShipOrderRecords extends AuditModel implements Serializable {private static final long serialVersionUID = -6873931504419257515L;@Id@GeneratedValue(strategy = GenerationType.AUTO,generator = "pg-uuid")@GenericGenerator(name = "pg-uuid",strategy = "uuid2",parameters = @org.hibernate.annotations.Parameter(name = "uuid_gen_strategy_class",value = "com.decathlon.shiphub.common.util.PostgreSQLUUIDGenerationStrategy"))@Column(name = "id", columnDefinition = "uuid default uuid_generate_v4()")private UUID id;@Column(name = "ship_status", columnDefinition = "int2 default 0")private int shipStatus;@Column(name = "reason_code")private String reasonCode;@Column(name = "comment")private String comment;@Column(name = "data_status", columnDefinition = "int2 default 0")private Byte dataStatus;@OneToMany(mappedBy = "shipOrderRecords", cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)@JsonManagedReferenceprivate List<ShipOrderLogs> shipOrderLogsList;@OneToOne(cascade = CascadeType.REFRESH)@JoinColumn(name = "order_info_id")@JsonBackReferenceprivate ShipOrderInfo shipOrderInfo;
}
@Data
@Entity(name = "ShipOrderLogs")
@Table(name = "ship_order_logs")
public class ShipOrderLogs extends AuditModel implements Serializable {private static final long serialVersionUID = 7671064435799278019L;@Id@GeneratedValue(strategy = GenerationType.AUTO,generator = "pg-uuid")@GenericGenerator(name = "pg-uuid",strategy = "uuid2",parameters = @org.hibernate.annotations.Parameter(name = "uuid_gen_strategy_class",value = "com.decathlon.shiphub.common.util.PostgreSQLUUIDGenerationStrategy"))@Column(name = "id", columnDefinition = "uuid default uuid_generate_v4()")private UUID id;@Column(name = "request_body", length = 3000)private String requestBody;@Column(name = "response_body", length = 3000)private String responseBody;@Column(name = "log_desc")private String logDesc;@ManyToOne(cascade = CascadeType.REFRESH)@JoinColumn(name = "order_records_id")@JsonBackReferenceprivate ShipOrderRecords shipOrderRecords;
}
需要注意的是:
(1)多对多情况,可以不用这种注解的方式,可以通过中间表维护级联关系(比如A和B表多对多,C表只包含2列A和B的主键映射,维护多对多关系),操作可能更方便。
(2)这种级联谨慎使用,在查询等操作的时候,查A实体,也会把级联的B或C实体也查出来,但业务只需要A的信息,所以可能增加数据库负担。
JPA中@OneToOne 与 @OneToMany 的用法相关推荐
- JPA 中 one-toone 一对一 映射
用户信息表: User @Entity @Table(name="users") @Cache(usage=CacheConcurrencyStrategy.READ_ONLY) ...
- JPA 中使用 @OneToMany 、@ManyToOne 等关系映射注解
JPA 做 ORM(Object Relational Mapping,对象关系映射)时,为了开发效率,通常会在实体类上用 hibernate 的关系关联注解. 包括:@OneToOne. @OneT ...
- JPA中@OneToMany @ManyToOne删除问题
JPA中使用@OneToMany维护"一"对"多"的关系时,需要在"一"端的@OneToMany上配置一个关键参数orphanRemoval ...
- Jpa 中怎么玩一对多?
Jpa 中的一对一.一对多没搞明白的话,总会觉得有点绕,今天咱们来简单聊聊这个话题. 1. 一对一 比如说一个学校有一个地址,一个地址只有一个学校. 那么我们可以按照如下方式来设计类: @Data @ ...
- JPA中实现双向一对一的关联关系
场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...
- JPA中实现双向一对多的关联关系
场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...
- JPA中实现单向一对多的关联关系
场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...
- Spring Boot JPA中关联表的使用
文章目录 添加依赖 构建Entity 构建Repository 构建初始数据 测试 Spring Boot JPA中关联表的使用 本文中,我们会将会通过一个Book和Category的关联关系,来讲解 ...
- jpa中的表关系以及多表CRUD操作
文章目录 一对多的关系映射 第一步 明确两张表的关系 第二步 在数据库中建立两张表的关系 第三步 在实体类中建立两个实体间的关系 第四步 关联关系维护的放弃 实体类 一对多的增删 级联删除 多对多 保 ...
最新文章
- java面向对象电子科大版答案_电子科大17秋《面向对象程序设计》在线作业1
- spring cloud-zuul的Filter详解
- 图片瀑布流Html,真的!!!两行css代码实现瀑布流,html,css最简单的瀑布流实现方式且没有缺点...
- 文巾解题 01.05. 一次编辑
- OFD文件结构--Signatures.xml
- python bmp转jpg_利用python实现.dcm格式图像转为.jpg格式
- oracle architeture,ORACLE 11G Process Architecture(一)
- less文件的样式无法生效的一个原因,通过WEB浏览器访问服务器less文件地址返回404错误...
- 【Gym-100085 E】Eve【模拟题】
- Android 友盟分享(截图指定的View分享)
- 看看雅虎助手是如何迫害“兔子”和“360安全卫士”的
- vbs教程《弹出窗口》
- mfc使用matlab绘图,mfc调用matlab绘图
- Java 阴阳历转换
- uni-app 遮罩层事件穿透解决办法catchtouchmove
- 读《楚汉传奇》中历史故事悟项目管理
- 哈希算法-SHA-256-过程详解
- 已解决:出现了自己签名的证书。 错误: 证书通用名 “www.doctorcom.com” 与所要求的主机名 “raw.githubusercontent.com” 不符。
- Arduino 入门学习笔记7 I2C LCD1602液晶显示实验 及 超声波传感器距离检测
- linux如何脚本监控tps,对Linux进行详细的性能监控的方法
热门文章
- 一个完整的python文件即是一个模块_用Python玩转数据:python的函数、模块和包
- 名图空间实测_【图】名图:空间大油耗低,关键还直降3.8万!_汽车之家
- Vue.js页面跳转后返回上一页面记录上一页面select选定的值
- 2014年第五届C/C++ B组蓝桥杯省赛真题
- Apache Kafka教程A系列:实时应用程序(Twitter)
- Android10.0,计步传感器(Sensor.TYPE_STEP_COUNTER) 无法计步
- 酒店预订系统(酒店管理系统(java毕业设计)
- 移动周刊第 190 期:移动开发性能优化全面解析
- python中异或怎么算_python 异或运算的前提_异或运算公式
- Neo4J图库的基础介绍(一)