【问题标题】:Why do we need a helper method inside @OneToMany annotated side in hibernate?为什么我们需要在休眠的@OneToMany 注释侧中使用辅助方法?
【发布时间】:2020-11-26 02:48:36
【问题描述】:

这里我有两个实体类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    

    
}

【问题讨论】:

    标签: java database hibernate orm nhibernate-mapping


    【解决方案1】:

    没有必要有这个方法。相反,这是一种方便的方法,允许快速将课程添加到属于讲师对象的课程List&lt;Course&gt;

    它的作用是初始化列表(如果尚未存在),将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);
    

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

    【讨论】:

      【解决方案2】:

      该方法只是检查列表是否为空,如果不存在则创建它,您可以使用以下方法将其省略:

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

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

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

      回答你的问题,你可以不用它来做同样的课程,但你必须在其他地方做这些事情,这个设计有效,但它的设计很糟糕,addCourse 应该是一个服务方法,把它放在那里使您成为具有逻辑和控制力的pojo实体,但方法的逻辑是正确的。

      【讨论】:

        猜你喜欢
        • 2017-01-11
        • 2011-08-08
        • 1970-01-01
        • 2014-10-16
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 2021-08-30
        • 1970-01-01
        相关资源
        最近更新 更多