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 的用法相关推荐

  1. JPA 中 one-toone 一对一 映射

    用户信息表: User @Entity @Table(name="users") @Cache(usage=CacheConcurrencyStrategy.READ_ONLY) ...

  2. JPA 中使用 @OneToMany 、@ManyToOne 等关系映射注解

    JPA 做 ORM(Object Relational Mapping,对象关系映射)时,为了开发效率,通常会在实体类上用 hibernate 的关系关联注解. 包括:@OneToOne. @OneT ...

  3. JPA中@OneToMany @ManyToOne删除问题

    JPA中使用@OneToMany维护"一"对"多"的关系时,需要在"一"端的@OneToMany上配置一个关键参数orphanRemoval ...

  4. Jpa 中怎么玩一对多?

    Jpa 中的一对一.一对多没搞明白的话,总会觉得有点绕,今天咱们来简单聊聊这个话题. 1. 一对一 比如说一个学校有一个地址,一个地址只有一个学校. 那么我们可以按照如下方式来设计类: @Data @ ...

  5. JPA中实现双向一对一的关联关系

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  6. JPA中实现双向一对多的关联关系

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  7. JPA中实现单向一对多的关联关系

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  8. Spring Boot JPA中关联表的使用

    文章目录 添加依赖 构建Entity 构建Repository 构建初始数据 测试 Spring Boot JPA中关联表的使用 本文中,我们会将会通过一个Book和Category的关联关系,来讲解 ...

  9. jpa中的表关系以及多表CRUD操作

    文章目录 一对多的关系映射 第一步 明确两张表的关系 第二步 在数据库中建立两张表的关系 第三步 在实体类中建立两个实体间的关系 第四步 关联关系维护的放弃 实体类 一对多的增删 级联删除 多对多 保 ...

最新文章

  1. java面向对象电子科大版答案_电子科大17秋《面向对象程序设计》在线作业1
  2. spring cloud-zuul的Filter详解
  3. 图片瀑布流Html,真的!!!两行css代码实现瀑布流,html,css最简单的瀑布流实现方式且没有缺点...
  4. 文巾解题 01.05. 一次编辑
  5. OFD文件结构--Signatures.xml
  6. python bmp转jpg_利用python实现.dcm格式图像转为.jpg格式
  7. oracle architeture,ORACLE 11G Process Architecture(一)
  8. less文件的样式无法生效的一个原因,通过WEB浏览器访问服务器less文件地址返回404错误...
  9. 【Gym-100085 E】Eve【模拟题】
  10. Android 友盟分享(截图指定的View分享)
  11. 看看雅虎助手是如何迫害“兔子”和“360安全卫士”的
  12. vbs教程《弹出窗口》
  13. mfc使用matlab绘图,mfc调用matlab绘图
  14. Java 阴阳历转换
  15. uni-app 遮罩层事件穿透解决办法catchtouchmove
  16. 读《楚汉传奇》中历史故事悟项目管理
  17. 哈希算法-SHA-256-过程详解
  18. 已解决:出现了自己签名的证书。 错误: 证书通用名 “www.doctorcom.com” 与所要求的主机名 “raw.githubusercontent.com” 不符。
  19. Arduino 入门学习笔记7 I2C LCD1602液晶显示实验 及 超声波传感器距离检测
  20. linux如何脚本监控tps,对Linux进行详细的性能监控的方法

热门文章

  1. 一个完整的python文件即是一个模块_用Python玩转数据:python的函数、模块和包
  2. 名图空间实测_【图】名图:空间大油耗低,关键还直降3.8万!_汽车之家
  3. Vue.js页面跳转后返回上一页面记录上一页面select选定的值
  4. 2014年第五届C/C++ B组蓝桥杯省赛真题
  5. Apache Kafka教程A系列:实时应用程序(Twitter)
  6. Android10.0,计步传感器(Sensor.TYPE_STEP_COUNTER) 无法计步
  7. 酒店预订系统(酒店管理系统(java毕业设计)
  8. 移动周刊第 190 期:移动开发性能优化全面解析
  9. python中异或怎么算_python 异或运算的前提_异或运算公式
  10. Neo4J图库的基础介绍(一)