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

yizhihongxing

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日

相关文章

  • JSP导出Excel文件的方法

    JSP导出Excel文件是一种常见的需求,在这里给出一个JSP导出Excel文件的完整攻略。 1. 准备工作 首先需要引入先关依赖。 jxl.jar (可从网络上下载):jxl是一款专门用于处理Excel文件的java类库,其中包含了读取和写入Excel文件等相关操作。 2. 导出Excel文件的主要过程 (1)定义数据集并填充数据 首先,我们需要定义一个要…

    Java 2023年6月15日
    00
  • MyBatis逆向⼯程的生成过程

    下面我将为你详细讲解”MyBatis逆向工程的生成过程”的完整攻略。 1. 确定逆向工程生成的目标文件 逆向工程是根据数据库中的表自动生成基于MyBatis框架的Java代码。因此,在进行逆向工程之前,我们需要先确定逆向工程生成的目标文件,包括要使用哪个数据库、要生成哪些表的代码等。 2. 配置逆向工程的生成参数 在进行逆向工程之前,我们需要先配置生成参数。…

    Java 2023年5月20日
    00
  • SpringBoot默认使用HikariDataSource数据源方式

    Spring Boot 是一种在 Spring 框架基础上开发应用程序的快速,便捷的方式。在 Spring Boot 应用程序中,HikariDataSource 是默认的数据源,以提高应用程序的性能。 Spring Boot 框架中默认使用 HikariDataSource 数据源方式,这是因为 HikariCP 是一个高性能的数据库连接池,它具有以下优点…

    Java 2023年5月20日
    00
  • 什么是Java程序优化?

    什么是Java程序优化? Java程序优化是指通过改进Java程序的设计、编写和运行方式,以提高程序性能、内存使用效率和响应速度的过程。Java程序优化在一个高质量、可维护、具有高性能的Java应用程序的开发过程中非常重要。以下是一些Java程序优化的实践方法和建议。 不要浪费内存: 在Java程序中,尤其是在Java Web应用程序中,内存是非常有限的资源…

    Java 2023年5月11日
    00
  • springboot 2.3之后消失的hibernate-validator解决方法

    下面是详细的攻略: 问题背景 在Spring Boot 2.3版本之后,引入了一个新的starter库,名为validation-starter,用于提供Java Bean的数据校验功能。同时,hibernate-validator也被移出了Spring Boot的核心依赖,这导致运行时找不到这个库,会报出ClassNotFoundException的错误。…

    Java 2023年5月20日
    00
  • SpringBoot外部化配置使用Plus版的方法示例

    Spring Boot通过外部化配置来让应用程序在不同环境下以相同的代码运行。配置数据可以存储在不同的位置和形式,并且可以通过属性文件、yaml文件、环境变量等多种方式进行配置。 1. 引入外部化配置的依赖 在pom.xml文件中,引入以下依赖即可实现外部化配置功能: <dependency> <groupId>org.springf…

    Java 2023年6月15日
    00
  • java连不上mysql8.0问题的解决方法

    以下是详细讲解”java连不上mysql8.0问题的解决方法”的完整攻略。 问题背景 在使用Java开发中,经常会使用MySQL作为数据存储的工具。但是在使用最新版本的MySQL(例如8.0版本)时,可能会出现无法连接数据库的问题。这可能是因为MySQL的默认加密机制所导致。 解决方法 方法一:设置MySQL的加密方式 在MySQL8.0版本中,默认采用了c…

    Java 2023年6月16日
    00
  • 关于.java编译成.class 与 .class反编译成.java问题

    关于 Java 编译成 .class 和 .class 反编译成 .java 的问题,这里提供完整的攻略如下: Java 编译成 .class 在 Java 中,我们编写的代码以 .java 文件的形式存储,但是计算机并不能直接运行这些代码,需要将其编译成目标格式的二进制代码。 Java 编译器可以将 Java 代码编译成字节码(bytecode),并将其保…

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