举一个简答的例子,学校里面有教学楼,教学楼里面有楼层,而楼层里面有一个个的教室,每个教室都有自己的编号,他们之间的关系如下:

学校

从图中可以看出,一个教学楼可以有多个楼层,而一个楼层只属于一个教学楼,同理,一层有多个教室,而一个教室只能属于一层楼,所以这就是数据的多对一关系。

那在JPA中是如何实现这些关系的呢?

创建实体类

我们分别创建三个实体类,抽象化教学楼、楼层、教室

@Entity
@Data
@Table(name = "mana_new_builiding")
public class NewBuilding { // 教学楼实体
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   Long bid;

   @Column
   String building_name;
   
}
@Entity
@Data
@Table(name = "mana_new_floor")
public class NewFloor {  //楼层实体
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   Long fid;

   @Column
   String floor_name;

   @ManyToOne
   @JoinColumn(name = "bid")
   NewBuilding building;

}
@Entity
@Data
@Table(name = "mana_new_classroom")
public class NewClassroom {  // 教室实体
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   Long cid;

   @Column
   String classroom_name;

   @ManyToOne
   @JoinColumn(name = "fid")
   NewFloor floor;

}

我们通过JPA的@ManyToOne注解(单向多对一),设置多对一关键,并使用 @JoinColumn(name = "xxx")注解来指定外键进行关联,,注意这里关联的是实体类的属性,而不是数据库中具体的字段

重启项目运行一下,查看一下数据库表结构是否正常生成

image-20210723181128837

接下来,我们插入几条数据,由于是层级包含关系,所以我们需要按照顺序一层一层的创建数据。

首先实例化楼栋,然后实例化楼层,最后实例化教室,接着按照这个顺序保存下来。

NewBuilding newBuilding = new NewBuilding();
newBuilding.setBuilding_name("博学楼");

NewFloor new_floor = new NewFloor();
new_floor.setFloor_name("一楼kaygb.com");
new_floor.setBuilding(newBuilding);

NewClassroom newClassRoom = new NewClassroom();
newClassRoom.setClassroom_name("301");
newClassRoom.setFloor(new_floor);

newBuildingRepository.save(newBuilding);
newFloorRepository.save(new_floor);
newClassroomRepository.save(newClassRoom);

List<NewClassroom> newClassrooms = newClassroomRepository.findAll();

执行之后从数据库中查看,已经成功写入数据

image-20210723190807506

通过JSON获取全部数据

image-20210723190913939

微信公众号
最后修改:2021 年 07 月 23 日 07 : 14 PM
如果您觉得我的文章有帮助,请随意赞赏!