@ManyToMany

本文深入探讨了在对象关系映射(ORM)中,如何使用@ManyToMany注解进行多对多关系的映射,详细解析了@JoinTable、mappedBy属性的作用以及CascadeType的不同选项如PERSIST、MERGE、REMOVE等在级联操作中的具体应用。
	@ManyToMany( cascade = { CascadeType.PERSIST, CascadeType.MERGE })
	@JoinTable(name = "TEACHER_TO_STUDENT", joinColumns = { @JoinColumn(name = "TEACHER_ID") }, inverseJoinColumns = { @JoinColumn(name = "STUDENT_ID") })
	@Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE })
	@OrderBy("name")
	private Set<Student> students;
    @ManyToMany(mappedBy = "students",cascade = { CascadeType.PERSIST,CascadeType.MERGE })
    @OrderBy("id")
    private Set<Teacher> teachers = new HashSet<>();

保存的时候 只需要teacher.setStudent(“student的set”);
保存teacher 就可保存中间库

解释:
1、mappedBy:使用此属性的那一端,就意味着放弃了对关系的维护,也不能增删改查中间表的关系;/2、2、@JoinTable:中间表的名字及字段
3、CascadeType:

CascadeType.REMOVE
Cascade remove operation,级联删除操作。

CascadeType.MERGE
Cascade merge operation,级联更新(合并)操作。

CascadeType.DETACH
Cascade detach operation,级联脱管/游离操作。

CascadeType.REFRESH
Cascade refresh operation,级联刷新操作。

CascadeType.PERSIST
级联保存:

CascadeType.ALL
全包含

`@ManyToMany` 是一种常见的注解(或装饰器),通常出现在使用 ORM(对象关系映射)框架的场景中,比如 Java 的 Hibernate 或 Python 的 SQLAlchemy。它用于定义两个实体之间的多对多关系。 以下是一个典型的 `@ManyToMany` 使用场景的解决方案和解释。 --- ### 示例:使用 Java 和 Hibernate 实现多对多关系 #### 1. 创建实体类 假设我们有两个实体:`Student` 和 `Course`,一个学生可以选修多门课程,一门课程也可以被多个学生选修。 以下是代码实现: ```java import javax.persistence.*; import java.util.HashSet; import java.util.Set; @Entity public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // 定义多对多关系 @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinTable( name = "student_course", // 中间表名称 joinColumns = @JoinColumn(name = "student_id"), // 当前实体的外键列名 inverseJoinColumns = @JoinColumn(name = "course_id") // 关联实体的外键列名 ) private Set<Course> courses = new HashSet<>(); // 构造函数、getter 和 setter 方法 public Student() {} public Student(String name) { this.name = name; } public void addCourse(Course course) { courses.add(course); course.getStudents().add(this); } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Course> getCourses() { return courses; } public void setCourses(Set<Course> courses) { this.courses = courses; } } @Entity public class Course { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; // 定义多对多关系 @ManyToMany(mappedBy = "courses") private Set<Student> students = new HashSet<>(); // 构造函数、getter 和 setter 方法 public Course() {} public Course(String title) { this.title = title; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Set<Student> getStudents() { return students; } public void setStudents(Set<Student> students) { this.students = students; } } ``` --- ### 解释 1. **`@Entity` 注解**: - 表示这是一个 JPA 实体类,将映射到数据库中的表。 2. **`@Id` 和 `@GeneratedValue` 注解**: - `@Id` 表示该字段是主键。 - `@GeneratedValue` 表示主键值由数据库自动生成。 3. **`@ManyToMany` 注解**: - 定义了两个实体之间的多对多关系。 - `cascade` 属性指定了在执行某些操作时是否级联操作(如保存或更新关联实体)。 4. **`@JoinTable` 注解**: - 指定了中间表的名称以及外键列的名称。 - `joinColumns` 表示当前实体的外键列。 - `inverseJoinColumns` 表示关联实体的外键列。 5. **`mappedBy` 属性**: - 在反向关系中使用,表示该关系是由另一个实体维护的。 6. **`addCourse` 方法**: - 用于在建立关系时同时更新双方的集合。 --- ### 测试代码 以下是如何插入数据并查询多对多关系的示例: ```java import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class Main { public static void main(String[] args) { SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); // 创建学生和课程 Student student1 = new Student("Alice"); Student student2 = new Student("Bob"); Course course1 = new Course("Math"); Course course2 = new Course("Physics"); // 建立关系 student1.addCourse(course1); student1.addCourse(course2); student2.addCourse(course1); // 保存到数据库 session.save(student1); session.save(student2); transaction.commit(); session.close(); sessionFactory.close(); } } ``` --- ### 总结 - `@ManyToMany` 用于定义多对多关系。 - 需要使用中间表来存储两个实体之间的关系。 - `@JoinTable` 和 `mappedBy` 是配置多对多关系的关键。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值