JPA中的一对多

2.1 表之间关系的划分
数据库中多表之间存在着三种关系,如图所示。
在这里插入图片描述
从图可以看出,系统设计的三种实体关系分别为:多对多、一对多和一对一关系。注意:一对多关系可以看为两种: 即一对多,多对一。所以说四种更精确。

明确: 我们今天只涉及实际开发中常用的关联关系,一对多和多对多。而一对一的情况,在实际开发中几乎不用。
2.2 在JPA框架中表关系的分析步骤
在实际开发中,我们数据库的表难免会有相互的关联关系,在操作表的时候就有可能会涉及到多张表的操作。而在这种实现了ORM思想的框架中(如JPA),可以让我们通过操作实体类就实现对数据库表的操作。所以今天我们的学习重点是:掌握配置实体之间的关联关系。

第一步:首先确定两张表之间的关系。
如果关系确定错了,后面做的所有操作就都不可能正确。
第二步:在数据库中实现两张表的关系
第三步:在实体类中描述出两个实体的关系
第四步:配置出实体类和数据库表的关系映射(重点)

3.1 示例分析
我们采用的示例为客户和联系人。

客户:指的是一家公司,我们记为A。

联系人:指的是A公司中的员工。

在不考虑兼职的情况下,公司和员工的关系即为一对多。

3.2 表关系建立
在一对多关系中,我们习惯把一的一方称之为主表,把多的一方称之为从表。在数据库中建立一对多的关系,需要使用数据库的外键约束。

什么是外键?
指的是从表中有一列,取值参照主表的主键,这一列就是外键。

一对多数据库关系的建立,如下图所示
在这里插入图片描述
3.3 实体类关系建立以及映射配置
在实体类中,由于客户是少的一方,它应该包含多个联系人,所以实体类要体现出客户中有多个联系人的信息,代码如下:

/**
 * 客户的实体类
 * 明确使用的注解都是JPA规范的
 * 所以导包都要导入javax.persistence包下的
 */
@Entity//表示当前类是一个实体类
@Table(name="cst_customer")//建立当前实体类和表之间的对应关系
public class Customer implements Serializable {
	
	@Id//表明当前私有属性是主键
	@GeneratedValue(strategy=GenerationType.IDENTITY)//指定主键的生成策略
	@Column(name="cust_id")//指定和数据库表中的cust_id列对应
	private Long custId;
	@Column(name="cust_name")//指定和数据库表中的cust_name列对应
	private String custName;
	@Column(name="cust_source")//指定和数据库表中的cust_source列对应
	private String custSource;
	@Column(name="cust_industry")//指定和数据库表中的cust_industry列对应
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
一对多指的是一个实体类拥有多个关联实体类的关系。在Spring Data JPA,实现一对多关系需要在实体类使用注解来表示关系。 1. 定义实体类 在一对多关系,需要定义两个实体类,一个代表主实体类,一个代表子实体类。 主实体类: ```java @Entity public class Student { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "student", cascade = CascadeType.ALL, orphanRemoval = true) private List<Course> courses = new ArrayList<>(); } ``` 子实体类: ```java @Entity public class Course { @Id @GeneratedValue private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "student_id") private Student student; } ``` 在主实体类`Student`,使用`@OneToMany`注解定义了与子实体类`Course`的一对多关系。`mappedBy`属性指定了关系的反向属性为子实体类`Course`的`student`属性。`cascade`属性为级联操作,包括插入、更新和删除。`orphanRemoval`属性为关系的孤儿对象删除,即当主实体类的某个关联子实体类被删除时,该实体类也会被删除。 在子实体类`Course`,使用`@ManyToOne`注解定义与主实体类`Student`的多对一关系。`fetch`属性为数据抓取策略的定义,`JOIN`表示与主实体类同时查询,`LAZY`表示需要查询时才查询。`@JoinColumn`注解用来定义外键属性,`name`属性为关联主实体类的属性名。 2. 定义数据访问接口 定义数据访问接口`StudentRepository`: ```java public interface StudentRepository extends JpaRepository<Student, Long> { } ``` 3. 使用数据访问接口 ```java @Autowired private StudentRepository studentRepository; @Transactional public void test() { Student student = new Student(); student.setName("张三"); Course course1 = new Course(); course1.setName("语文"); course1.setStudent(student); Course course2 = new Course(); course2.setName("数学"); course2.setStudent(student); student.getCourses().add(course1); student.getCourses().add(course2); studentRepository.save(student); Student savedStudent = studentRepository.findById(student.getId()).get(); System.out.println(savedStudent.getCourses().size()); // 2 savedStudent.getCourses().remove(course1); studentRepository.save(savedStudent); Student updatedStudent = studentRepository.findById(student.getId()).get(); System.out.println(updatedStudent.getCourses().size()); // 1 } ``` 使用事务向数据库插入数据,查询实体类时,使用`get()`方法。通过关联实体类的属性进行操作,调用`save()`方法持久化数据。查询实体类后,使用集合的`remove()`方法从关联实体类删除对象,再调用`save()`方法更新数据。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值