@ManytoMany 查询数据 死循环

本文探讨了在使用SMO类和SMT类进行双向关联时可能出现的查询死循环问题,并提供了解决方案。通过重写SMO类的toString方法和在SMT类中限制对SMO对象的访问,可以有效避免此类问题,确保数据查询的正确性和效率。

在双向关联中出现查询死循环:

SMO类

SMT类 

 

查询SMO类,

SMO类包含了SMT的对象,SMT类中也包含了SMO类的对象,所以查询会死循环,只需要重写toString 即可,SMT类不重写SMO的对象,该方法json返回会报错,所以json返回部分字段即可。

`@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、付费专栏及课程。

余额充值