java jpa 字段 关联_JPA关联关系表中加其他字段

前言

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体[对象持久化]到数据库中。

Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。(出自百度百科)

JPA优点:上手快,使用简单。

JPA缺点:不适合关联关系复杂的项目。

正题

正常情况下使用@ManyToMany注解描述多对多关系时,JPA自动生成的表中是只包括两个对应实体的主键信息的。有些时候呢,就会遇到需要在关联表中加入想要的其他字段来辅助完成需求。比如部门与部门人之间关系。一个部门有多个人,一个又可以属于多个部门,一个人在不同的部门之间有不同的身份,在做展示的时候就涉及排序问题,一个人在不同的部门拥有不一样的排序。

这里以老师,学生,老师对每个学生的印象分来进行编码。主体思路就是将@ManyToMany生成的关系表单独作为一个类,使用两个@ManyToOne来进行实现。

一、老师实体类

package com.ysh.springboot.permissions.test;

import java.util.List;

import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.OneToMany;

import javax.persistence.Table;

import lombok.Getter;

import lombok.Setter;

/**

*

* @author ysh

* @date 2020/01/03

*/

@Entity

@Table(name = "teacher")

@Getter

@Setter

public class Teacher {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private int id;

@Column(name = "name")

private String name;

@Column(name = "age")

private int age;

@OneToMany(mappedBy = "teacher", fetch = FetchType.EAGER,cascade = CascadeType.ALL)

private List teacherStudents;

}

二、学生实体类

package com.ysh.springboot.permissions.test;

import java.util.List;

import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.OneToMany;

import javax.persistence.Table;

import lombok.Getter;

import lombok.Setter;

/**

*

* @author ysh

* @date 2020/01/03

*/

@Entity

@Table(name = "student")

@Getter

@Setter

public class Student {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private int id;

@Column(name = "name")

private String name;

@OneToMany(mappedBy="student", fetch = FetchType.EAGER,cascade=CascadeType.ALL)

private List teacherStudents;

}

三、老师对学生印象分类

package com.ysh.springboot.permissions.test;

import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.ManyToOne;

import javax.persistence.Table;

import lombok.Getter;

import lombok.Setter;

/**

*

* @author ysh

* @date 2020/01/03

*/

@Entity

@Table(name = "teacher_student")

@Getter

@Setter

public class TeacherStudent {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private int id;

@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)

@JoinColumn(name = "t_id")

private Teacher teacher;

@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)

@JoinColumn(name = "s_id")

private Student student;

@JoinColumn()

@Column(nullable=true,name="impression_score")

private int impressionScore;

}

四、表生成结构

c2d4f103c63c?utm_campaign=haruki&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

表生成结构

五、使用

通过关系表类来获取需要的辅助字段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JPA 中,如果你想要关联的部分字段,可以使用 `@JoinColumn` 注解和 `@ManyToOne` 或 `@OneToOne` 注解来定义关联关系。然后,你可以使用 `@JoinColumn` 注解的 `referencedColumnName` 属性来指定关联中的字段。 下面是一个示例: ```java @Entity @Table(name = "employee") public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne @JoinColumn(name = "department_id", referencedColumnName = "id") private Department department; // Getter and Setter methods } @Entity @Table(name = "department") public class Department { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // Getter and Setter methods } ``` 在上面的示例中,`Employee` 实体类与 `Department` 实体类通过 `department_id` 字段进行关联。如果你只想要获取关联 `Department` 的部分字段,可以在 `Department` 实体类中定义一个新的类似于 DTO(数据传输对象)的类,该类仅包含需要的字段。 例如,假设你只想要获取部门的名称(字段 `name`),你可以创建一个名为 `DepartmentDto` 的类: ```java public class DepartmentDto { private String name; public DepartmentDto(String name) { this.name = name; } // Getter and Setter methods } ``` 然后,在 `Employee` 实体类中,你可以添加一个返回 `DepartmentDto` 类型的方法,用于获取关联 `Department` 的部分字段: ```java @Entity @Table(name = "employee") public class Employee { // ... public DepartmentDto getDepartmentName() { return new DepartmentDto(department.getName()); } // ... } ``` 这样,当你查询 `Employee` 实体时,调用 `getDepartmentName()` 方法就可以获取到部门的名称。 请注意,上述示例中的代码仅为演示目的,并未完整展示 JPA 的所有配置和方法。实际使用时,你可能需要根据自己的业务需求进行适当的调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值