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技术站