JPA+MySQL详解

JPA+MySQL详解

首先明确两个端的关联关系,在java实体类定义中,含有mappedBy属性的时关系被维护端,含有关联字段的是关系维护端。

一、OneToOne关联关系

假设有实体People和Address,他们的关系是一对一,再设定People实体是关系的维护端,应有如下设计

//People.java
@Entity
@Table(name = "people")
public class People {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;//id
    @Column(name = "\"name\"", nullable = true, length = 20)//这个name加上双引号的原因是在jpa转为sql的时候会把name识别成sql关键字导致报错,反斜杠用来转义
    private String name;//姓名
    @OneToOne(cascade=CascadeType.ALL)//People是关系的维护端,当对People对象进行增删改时,会同时对address对象进行增删改
    @JoinColumn(name = "address_id", referencedColumnName = "id")//people中的address_id字段参考address表中的id字段
    private Address address;//地址
    
    //getter and setter
}

//Address.java
@Entity
@Table(name = "address")
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;//id
    
    @Column(name = "location", nullable = true, length = 100)
    private String location;//位置
    
    @OneToOne(mappedBy = "address")//这里没有级联操作,不需要维护关系
    private People people;
    
    //getter and setter
}

二、OneToMany/ManyToOne关联关系

在一对多关系中,“一”的一端是关系被维护端,它含有“多”的一端的对象集合属性,用@OneToMany注释这个属性;“多”的一端是关系维护端,它含有“一”的一端的对象属性,用@ManyToOne注释这个属性。

假设有实体User和Department,他们的关系是多对一的关系,有如下设计

//User.java
@Entity
@Table(name = "user")
public class UserEntity {

    @GenericGenerator(name = "uuid", strategy = "uuid")
    @GeneratedValue(generator = "uuid")
    @Id
    private String id;
    @Column(name = "\"name\"")
    private String name;
    
    @JoinColumn(name = "department_id", referencedColumnName = "id")
    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH}, optional = false)//一般需要级联合并和刷新,具体结合业务需求,optional=false表示department不可为空
    private SabDepartmentEntity department;
    
    //getter and setter
}

//Department.java
@Entity
@Table(name = "department")
public class DepartmentEntity {

    @GenericGenerator(name = "uuid", strategy = "uuid")
    @GeneratedValue(generator = "uuid")
    @Id
    private String id;
    @Column(name = "\"name\"")
    private String name;
    
    @OneToMany(mappedBy = "department", fetch = FetchType.LAZY, cascade = CascadeType.ALL)//这里需要所有级联操作,具体可以结合业务需求
    private List<SabUserEntity> users;
    
    //getter and setter
}

三、ManyToMany关联关系

多对多的关联关系中一般不设置级联操作,根据需求来决定任意一方为关系维护端,关系维护端的属性仍然有关联字段的声明,关系被维护端仍然有mappedBy的声明。值得注意的是,关系被维护端并不能直接删除对象,如果需要删除,需要先将其对应的关系维护端中的关系删除,比如有用户和角色,用户是关系维护端,如果要删除角色,需要先将对应的用户的角色列表中这个角色清除,才能删除角色。而关系维护端可以直接删除,假如设置了级联删除,举个例子,删除用户时也会删除角色。一般关联关系表使用的是两个外键作为双主键。

//User.java
@Entity
@Table(name = "user")
public class userEntity {

    @GenericGenerator(name = "uuid", strategy = "uuid")
    @GeneratedValue(generator = "uuid")
    @Id
    private String id;
    @Column(name = "\"name\"")
    private String name;
	
     @JoinTable(name = "sab_user_role_rel",
            joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")}
    )//这个joinColumns的JoinColumn的name是当前实体在关联关系中的外键列,inverseJoinColumns的JoinColumn的name是对方实体在关联关系中的外键列,referencedColumnName是指该实体在本身实体中的主键列
    @ManyToMany
    private List<SabRoleEntity> roles;
    
    //getter and setter
}

//Role.java
@Entity
@Table(name = "role")
public class RoleEntity {

    @GenericGenerator(name = "uuid", strategy = "uuid")
    @GeneratedValue(generator = "uuid")
    @Id
    private String id;
    @Column(name = "\"name\"")
    private String name;
    
    @ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY)
    private List<SabUserEntity> users;
    
    //getter and setter
}

另外附上级联操作作用的解析
jpa级联操作Cascade解析

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学籍管理系统是一个用于管理学生的基本信息、课程信息和成绩信息的系统。基于Vue3、Element Plus、Spring Boot、MyBatis、JPAMySQL的学籍管理系统具有以下特点和功能。 1. 前端界面使用Vue3和Element Plus框架,实现了美观、简洁的用户界面,提供了良好的用户体验。 2. 后端使用Spring Boot作为应用框架,简化了系统的搭建和开发。同时,基于MyBatis和JPA技术实现与数据库的交互,提供高性能和灵活性。 3. 数据库使用MySQL,存储学生的基本信息、课程信息和成绩信息,保证了数据的持久性和安全性。 4. 学籍管理系统提供了学生信息的录入、查询和修改功能。管理员可以通过界面录入学生的基本信息,包括姓名、学号、性别、年龄等。同时,还可以查询和修改学生的信息,确保信息的准确性。 5. 系统还提供了课程信息的管理功能。管理员可以录入课程的名称、学分、教师等信息,方便学生选课和教师进行课程管理。 6. 学籍管理系统还包括成绩管理功能。管理员可以录入学生的成绩,系统会自动计算学生的平均成绩和绩点,并提供成绩查询功能,方便学生和教师查看学生成绩。 7. 系统还提供了权限管理功能,确保只有授权用户可以进行相关操作,保证了数据的安全性。 综上所述,基于Vue3、Element Plus、Spring Boot、MyBatis、JPAMySQL的学籍管理系统具有方便、快捷、安全、准确的特点,能够有效管理学生的基本信息、课程信息和成绩信息。在教育领域的学籍管理中具有重要的应用价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值