Requirement 1 - Models:
In the Project you have two Model classes named Student.java and Course.java under Model package. Each Model class requires:

no args constructor
all args constructor
required args constructor
setters and getter
toString (exclude collections to avoid infinite loops)
override equals and hashcode methods (don't use lombok here)
helper method
Student (@Table(name = "student"))
Field	Datatype	Description	Database attributes @Column()
email	String	Student’s unique identifier	Primary key, 50 character limit, name email
name	String	Student’s name	50 character limit, not null, name name
password	String	Student’s password	50 character limit not null, name password
courses	Set<Course>	Student courses list	Join table strategy name student_courses , name of student primary key column student_email and inverse primary key (courses) column courses_id , fetch type EAGER, cascade type DETACH,REMOVE,MERGE,PERSIST
Course (@Table(name = "course")):
Field	Datatype	Description	Database attributes @Column()
id	int	Course unique identifier	Primary key , generation type IDENTITY,
name	String	Course name	50 character limit, not null
instructor	String	Instructor name	50 character limit not null
students	Set<Student>	Course learners list	fetch type EAGER, cascade type DETACH,REMOVE,MERGE,PERSIST, mappedBy courses
Requirement 2 - Data Access Object (dao) interfaces:
StudentI:
You can NOT add more methods in the interfaces than the definition below.
Abstract method	Return type	Parameters	Description
createStudent	void	Student	persist student to database, also handle commit,rollback, and exceptions
getAllStudents	List<Student>	None	return all students from database, also handle commit,rollback, and exceptions
getStudentByEmail	Student	String email	return student if exists, also handle commit,rollback, and exceptions
validateStudent	boolean	String email, String password	match email and password to database to gain access to courses, also handle commit,rollback, and exceptions
registerStudentToCourse	void	String email, int courseId	register a course to a student (collection to prevent duplication), also handle commit,rollback, and exceptions
getStudentCourses	List<Course>	String email	get all the student courses list (use native query), also handle commit,rollback, and exceptions
CourseI:
You can NOT add more methods in the interfaces than the definition below.
Abstract method	Return type	Parameters	Description
createCourse	void	Course	persist course to database, also handle commit,rollback, and exceptions
getAllCourses	List<Course>	None	return all courses from database, also handle commit,rollback, and exceptions
getCourseById	Course	int courseId	return course if exists, also handle commit,rollback, and exceptions
Requirement 3 - Service layer:
The classes listed below are concrete classes. The following class implements the StudentI and CourseI interfaces, as well as overrides and implements all abstract service methods.

implement interfaces:

StudentService
CourseService
Requirement 4 - Utility classes:
HibernateUtil.java - hibernate configuration session factory helper
CommandLine.java - data initializer helper (dummy data dump).
Configuration file (hibernate.cfg.xml) can be found under src/main/resources/
Requirement 5 - JUnit:
Write at least one junit test
Project Tree example
project_tree

Workflow example