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日

相关文章

  • Java 中的 print() 和 println()

    当我们在编写 Java 代码时,常常要向控制台输出文本信息,Java 中的 print() 和 println() 方法可以帮助我们达到这个目的。 print() 和 println() 方法的区别 Java 中的 print() 和 println() 方法都可以向控制台输出文本信息,但它们的区别在于: print() 方法不会在输出信息后自动换行,输出的…

    Java 2023年5月26日
    00
  • Spring源码剖析之Spring处理循环依赖的问题

    下面就是关于“Spring源码剖析之Spring处理循环依赖的问题”的完整攻略。 标题:Spring源码剖析之Spring处理循环依赖的问题 什么是循环依赖? 循环依赖指的是在Spring容器初始化bean时,A对象依赖B对象,同时B对象又依赖A对象。这种情况下,Spring无法推断依赖关系,会抛出BeanCurrentlyInCreationExcepti…

    Java 2023年5月31日
    00
  • SpringBoot与SpringSecurity整合方法附源码

    下面是SpringBoot与SpringSecurity整合方法的攻略: 前置要求 本文假设你已经具备以下的知识储备: SpringBoot的基础知识 SpringSecurity的基础知识 如果你还不太熟悉这些知识,我建议你先去学习一下,再来阅读本文。 步骤一:创建SpringBoot项目 首先我们需要创建一个SpringBoot项目,你可以使用任何一种方…

    Java 2023年5月20日
    00
  • jdbc调用mysql存储过程实现代码

    下面为您详细讲解“JDBC调用MySQL存储过程实现代码”的完整攻略。 什么是存储过程 存储过程是预先编译好的一段 SQL 代码,存储在数据库中,并可返回结果或影响数据库状态。其使用方法类似于函数,可以传递参数,执行一些特定操作,并返回结果集或状态。 创建存储过程 在 MySQL 中,可以使用以下语法创建一个简单的存储过程: DELIMITER // CRE…

    Java 2023年6月16日
    00
  • Logger.error打印错误异常的详细堆栈信息

    Logger是一种Java日志框架,用于在Java应用程序中记录和输出各种事件的消息。Logger.error()方法是Logger框架中的一个方法,通常用于记录和输出错误和异常的详细信息。 要打印错误异常的详细堆栈信息,可以使用Logger.error()方法并将异常作为参数。下面是使用Logger.error()方法打印异常堆栈信息的完整攻略: 导入相关…

    Java 2023年5月27日
    00
  • 详解Java Synchronized的实现原理

    接下来我就为您详细讲解“详解Java Synchronized的实现原理”的攻略。 标题:详解Java Synchronized的实现原理 一、基本概念 首先,我们需要了解Java Synchronized的基本概念。在Java中,Synchronized是一种同步机制,可以防止多个线程同时访问一个特定的代码块,从而避免数据不一致的问题。 二、内部原理 具体…

    Java 2023年5月26日
    00
  • MySql实现翻页查询功能

    MySql实现翻页查询功能的完整攻略 什么是翻页查询? 翻页查询是指当查询结果集的数据过多,一次显示不全,把数据分页查询以实现多页查询的技巧。这在Web应用程序中非常常用,比如搜索引擎的结果页面,商品列表页等。 实现翻页查询的方式 在MySql中,实现翻页查询可以通过limit关键字实现。limit语句限制查询结果集的行数,并且提供偏移量,以实现分页查询。 …

    Java 2023年6月15日
    00
  • Spring框架中 @Autowired 和 @Resource 注解的区别

    在Spring框架中,@Autowired和@Resource注解都是用于进行依赖注入的。两者都可以自动装配bean,但它们之间还是存在一些区别。 1. @Autowired注解 1.1 功能 @Autowired是Spring自带的依赖注入注解。它实现了自动装配,Spring会根据类型自动注入到字段、构造方法或者是setter方法上来完成属性的注入。 1.…

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