ManyToMany单向、双向:@JoinTable的使用

ManyToMany 单向使用 @JoinTable 的完整攻略

ManyToMany 单向关系适用于两个实体之间是互相独立的,例如学生可以选择多个课程,而课程也可以被多个学生选择。我们可以使用 @ManyToMany 注解来映射这样的关系。当两个实体之间是互相依赖的,例如 Order 和 Product,我们就需要使用双向 ManyToMany,可以参考第二个示例。

1. 创建实体类

我们可以创建两个实体类:Student 和 Course,它们之间的关联关系是一对多。

@Entity
public class Student {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(nullable = false)
  private String name;

  @ManyToMany
  @JoinTable(
    name="student_course",
    joinColumns=@JoinColumn(name="student_id"),
    inverseJoinColumns=@JoinColumn(name="course_id"))
  private List<Course> courses = new ArrayList<Course>();

  // getters and setters
}

@Entity
public class Course {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(nullable = false)
  private String name;

  // getters and setters
}

2. 创建关联表

使用 @JoinTable 注解指定关联表的名称和对应外键的列名。

@JoinTable(
  name="student_course",
  joinColumns=@JoinColumn(name="student_id"),
  inverseJoinColumns=@JoinColumn(name="course_id"))

3. 添加数据

我们可以往 Student 和 Course 表中添加数据,然后把它们关联起来。

Student student1 = new Student();
student1.setName("Tom");

Course course1 = new Course();
course1.setName("Math");

Course course2 = new Course();
course2.setName("Science");

student1.getCourses().add(course1);
student1.getCourses().add(course2);

entityManager.persist(student1);

4. 查询数据

我们可以通过 Student 和 Course 表中的数据查询出学生选择的课程。

Student student = entityManager.find(Student.class, 1L);
List<Course> courses = student.getCourses();
for (Course course : courses) {
  System.out.println(course.getName());
}

ManyToMany 双向使用 @JoinTable 的完整攻略

双向 ManyToMany 关系适用于两个实体之间是互相依赖的,例如 Order 和 Product,一个订单可以包含多个商品,一个商品也可以被多个订单包含。在双向关系中,我们需要在两个实体类中使用 @ManyToMany 注解和 @JoinTable 注解。在这个例子中,我们将使用 Order 和 Product 作为实体类。

1. 创建实体类

@Entity
public class Order {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(nullable = false)
  private String orderNumber;

  @ManyToMany
  @JoinTable(
    name="order_product",
    joinColumns=@JoinColumn(name="order_id"),
    inverseJoinColumns=@JoinColumn(name="product_id"))
  private List<Product> products = new ArrayList<Product>();

  // getters and setters
}

@Entity
public class Product {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(nullable = false)
  private String name;

  @ManyToMany(mappedBy="products")
  private List<Order> orders = new ArrayList<Order>();

  // getters and setters
}

2. 创建关联表

使用 @JoinTable 注解指定关联表的名称和对应外键的列名。

@JoinTable(
  name="order_product",
  joinColumns=@JoinColumn(name="order_id"),
  inverseJoinColumns=@JoinColumn(name="product_id"))

3. 添加数据

我们可以往 Order 和 Product 表中添加数据,然后把它们关联起来。

Order order = new Order();
order.setOrderNumber("202201010001");

Product product1 = new Product();
product1.setName("Coca Cola");

Product product2 = new Product();
product2.setName("Pepsi");

order.getProducts().add(product1);
order.getProducts().add(product2);

product1.getOrders().add(order);
product2.getOrders().add(order);

entityManager.persist(order);

4. 查询数据

通过 Order 和 Product 表中的数据,我们可以查询出一个订单包含的商品,或者一个商品被包含在哪些订单中。

// 查询订单
Order order = entityManager.find(Order.class, 1L);
List<Product> products = order.getProducts();
for (Product product : products) {
  System.out.println(product.getName());
}

// 查询商品
Product product = entityManager.find(Product.class, 1L);
List<Order> orders = product.getOrders();
for (Order order : orders) {
  System.out.println(order.getOrderNumber());
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ManyToMany单向、双向:@JoinTable的使用 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 微信小程序实现一键登录

    实现微信小程序的一键登录,可以使用微信开放平台提供的第三方授权登录功能。以下是具体的实现攻略: 1. 准备工作 首先要申请微信开放平台的帐号并完成认证 在开放平台中创建自己的小程序,并获取小程序的 AppID 和 AppSecret 2. 添加授权登录 将微信提供的授权登录组件添加到小程序中。 <!– index.wxml –> <bu…

    Java 2023年5月23日
    00
  • jsp传值本地无乱码测试机出现乱码问题解决

    下面我将详细讲解“jsp传值本地无乱码测试机出现乱码问题解决”的完整攻略。 一、问题描述 当我们在本地运行jsp页面传输值,并将页面上传至测试机运行时,有时会出现中文乱码的问题。这是因为本地和测试机的编码不一致所造成的。 二、解决方法 配置jsp页面编码方式 在jsp页面中,加入以下代码进行页面编码的设置。以UTF-8编码方式为例: <%@ page …

    Java 2023年6月15日
    00
  • cmd使用javac和java及注意事项

    当使用 Windows 操作系统时,CMD 是一种最为常见的命令行工具。在使用 CMD 运行 Java 命令时,需要使用 javac 和 java 命令。本篇攻略将详细讲解 CMD 使用 javac 和 java 命令的注意事项以及两条示例。 注意事项 在使用 CMD 运行 Java 命令时,需要按照以下步骤进行操作: 环境变量设置:首先需要设置 JAVA_…

    Java 2023年5月23日
    00
  • 详解Spring boot操作文件的多种方式

    详解Spring Boot操作文件的多种方式 在Spring Boot应用程序中,操作文件是一个非常常见的需求。本文将详细介绍Spring Boot操作文件的多种方式,包括使用Java IO、Apache Commons IO、Spring Framework和Spring Boot提供的API。 使用Java IO操作文件 Java IO是Java标准库中…

    Java 2023年5月15日
    00
  • 基于Java回顾之I/O的使用详解

    基于Java回顾之I/O的使用详解 什么是I/O I/O是输入输出的缩写,Java中I/O指的是从输入源读取数据,或将数据输出到输出目标。Java提供了大量的I/O类和接口,以方便我们处理各种输入和输出。 I/O的分类 输入流 输入流用于从输入源读取数据,Java提供了多种输入流,常用的有: FileInputStream:从文件中读取数据。 ByteArr…

    Java 2023年5月26日
    00
  • SpringBoot入门实现第一个SpringBoot项目

    首先,我们需要进行一些准备工作: 安装JDK,并配置好环境变量。 安装Maven,并配置好环境变量。 安装IDEA或者其他Java开发工具。 接下来,按照以下步骤来进行SpringBoot入门实现第一个SpringBoot项目。 1. 创建一个SpringBoot项目 我们可以通过使用Spring Initializr来创建一个SpringBoot项目,步骤…

    Java 2023年5月15日
    00
  • spring boot前后端交互之数据格式转换问题

    下面是“Spring Boot前后端交互之数据格式转换问题”的完整攻略。 1. 概述 在使用Spring Boot进行前后端交互时,常常会涉及到数据格式的转换问题,例如将Java对象转换为JSON对象,或将JSON对象转换为Java对象。这在前后端交互中非常常见,本文将简单介绍如何解决这些问题。 2. Java对象转JSON对象 Java对象转JSON对象最…

    Java 2023年5月20日
    00
  • Java编程思想对象的容纳实例详解

    Java编程思想对象的容纳实例详解 在Java编程中,对象的容纳是一个非常重要的概念。在本文中,我们将详细介绍Java中对象的容纳,包括容纳的数据类型和常用的容纳实例方法。 容纳的数据类型 Java中可以容纳的数据类型非常多,比如基本数据类型(byte、short、int、long、float、double、char、boolean)、数组、对象、接口等等。…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部