为什么我们在hibernate中的@OneToMany注释端需要一个helper方法



这里有两个实体类,称为Course和Coacher,遵循双向一对多关系。源代码如下。我需要知道讲师类中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    

}

Vlad Mihalcea表示,双方(父级和子级(应该同步,这样就不会破坏域模型的一致性并避免状态转换错误:https://vladmihalcea.com/jpa-hibernate-synchronize-bidirectional-entity-associations/

不需要这个方法。相反,这是一种方便的方法,允许将课程快速添加到属于讲师对象的课程的List<Course>中。

这样做的目的是初始化列表(如果还不存在(,将Course对象设置为课程列表,并将Instructor对象设置为传入的Course对象。

您可以很好地用以下代码替换此方法,并且仍然可以获得相同的结果:

public class Instructor {
// misc stuff here
Set<Course> courses = new HashSet<>();
//standard getters/setters
}

然后你可以简单地这样做:

Course course = new Course();
course.setTitle("My Title");
course.setIntructor(instructor);
instructor.getCourses().add(course);

除了不初始化列表对象之外,上面所做的基本上就是您的方法所做的。

该方法只检查列表是否为null,如果不存在,则创建该列表。您可以使用:

@OneToMany(mappedBy ="instructor" ,
cascade= {CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.PERSIST,
CascadeType.REFRESH}) 
private List<Course> courses = new ArrayList<>();

它所做的另一件事是添加对课程的引用,以确保关系是双向的,其中课程引用讲师,反之亦然。

您可以将其取出,并在服务方法中进行这些检查。

为了回答你的问题,你可以在没有它的情况下创建同一个类,但你必须在其他地方做这些事情,这个设计有效,但它是糟糕的设计,addCourse应该是一个服务方法,把它放在那里会让你成为一个有逻辑和控制的pojo实体,但方法的逻辑是正确的。

最新更新