java - 为什么我们需要在休眠的@OneToMany 注释侧中使用辅助方法?
问题描述
这里我有两个实体类Course和Instructor,它们遵循双向的一对多关系。源代码如下。我需要知道Instructor类中addCourse()方法的需要是什么,我们不能创建这个类没有它?
源代码。
讲师班
@Entity
@Table(name="Instructor")
public class Instructor {
@Id
@GeneratedValue(strategy =GenerationType.IDENTITY )
@Column(name="id")
private int id;
@Column(name="first_name")
private String firtName;
@Column(name="last_name")
private String lastName;
@Column(name="email")
private String email;
@OneToMany(mappedBy ="instructor" ,cascade= {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
private List<Course> courses;
//Getters and Setters + Constructors + toString() method
public void addCourse(Course tempCourse) {//Helper method
if(courses == null) {
courses = new ArrayList<>();
}
courses.add(tempCourse);
tempCourse.setInstructor(this);
}
}
课程班
@Entity
@Table(name="course")
public class Course {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name="title")
private String title;
@ManyToOne(cascade ={CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH} )
@JoinColumn(name="instructor_id")
private Instructor instructor;
//Getters and Setters + Constructors + toString() method
}
解决方案
该方法只是检查列表是否为空,如果不存在则创建它,您可以使用以下方法将其排除在外:
@OneToMany(mappedBy ="instructor" ,
cascade= {CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.PERSIST,
CascadeType.REFRESH})
private List<Course> courses = new ArrayList<>();
它所做的另一件事是添加对课程的引用,以确保关系是双向的,课程引用讲师,反之亦然。
您可以将其取出并在服务方法中进行这些检查。
要回答您的问题,您可以在没有它的情况下制作相同的课程,但您必须在其他地方做这些事情,这种设计有效,但它的设计很糟糕,addCourse
应该是一种服务方法,把它放在那里会让您成为 pojo 实体有逻辑有控制力的东西,但方法的逻辑是对的。
推荐阅读
- sapui5 - 使用 sapUI5 VizFrame 连接的散点图
- javascript - 使用 Jest 触发方法后检查 Vue 组件数据
- python - 使用python将相同的文本颜色excel单元格合并为一个?
- swift - 如何让用户在退出应用程序时不会收到 (APNC) 通知?
- reactjs - useEffect 导致状态在父组件中被覆盖
- kubernetes - 无法从 Kubernetes 上的 Helm 启动 Vault
- opengl - 什么时候 CUDA/OpenGL 互操作线程是安全的?
- javascript - 无法使用智能卡库从wireshark 复制数据
- css - 任何人都可以建议两列高度的引导类
- flutter - 如何在颤动中重构手势检测器?