├── .gitignore ├── .idea ├── .gitignore ├── compiler.xml ├── dbnavigator.xml ├── encodings.xml ├── google-java-format.xml ├── jarRepositories.xml ├── misc.xml ├── uiDesigner.xml └── vcs.xml ├── README.md ├── jpatutorial.iml ├── pom.xml └── src ├── main ├── java │ └── org │ │ └── tutorial │ │ ├── App.java │ │ ├── model │ │ ├── Person.java │ │ ├── School.java │ │ ├── Student.java │ │ ├── Teacher.java │ │ └── Tutor.java │ │ └── repository │ │ ├── SchoolRepository.java │ │ ├── StudentRepository.java │ │ ├── TeacherRepository.java │ │ └── TutorRepository.java └── resources │ └── META-INF │ └── persistence.xml └── test ├── java └── org │ └── tutorial │ ├── AppTest.java │ └── StudentRepositoryTest.java └── resources └── META-INF └── persistence.xml /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/* 2 | jpatutorial.iml 3 | target 4 | .idea 5 | target/* -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/dbnavigator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/google-java-format.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/uiDesigner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jpatutorial 2 | 3 | Complete Java Persistence API (JPA) Tutorial. 4 | 5 | The Java Persistence API (JPA) is a Java specification for accessing, persisting, and managing data between Java objects / classes and a relational database. JPA was defined as part of the EJB 3.0 specification as a replacement for the EJB 2 CMP Entity Beans specification. JPA itself is just a specification, not a product; it cannot perform persistence or anything else by itself. JPA is just a set of interfaces, and requires an implementation. 6 | 7 | 8 | IMAGE ALT TEXT HERE 11 | -------------------------------------------------------------------------------- /jpatutorial.iml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 4.0.0 6 | 7 | org.tutorial 8 | jpa 9 | 1.0-SNAPSHOT 10 | 11 | jpa 12 | 13 | 14 | UTF-8 15 | 1.8 16 | 1.8 17 | 18 | 19 | 20 | 21 | junit 22 | junit 23 | 4.11 24 | test 25 | 26 | 27 | org.hibernate 28 | hibernate-core 29 | 5.4.18.Final 30 | 31 | 32 | com.h2database 33 | h2 34 | 1.4.200 35 | 36 | 37 | org.postgresql 38 | postgresql 39 | 42.2.14 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | maven-clean-plugin 50 | 3.1.0 51 | 52 | 53 | 54 | maven-resources-plugin 55 | 3.0.2 56 | 57 | 58 | maven-compiler-plugin 59 | 3.8.0 60 | 61 | 62 | maven-surefire-plugin 63 | 2.22.1 64 | 65 | 66 | maven-jar-plugin 67 | 3.0.2 68 | 69 | 70 | maven-install-plugin 71 | 2.5.2 72 | 73 | 74 | maven-deploy-plugin 75 | 2.8.2 76 | 77 | 78 | 79 | maven-site-plugin 80 | 3.7.1 81 | 82 | 83 | maven-project-info-reports-plugin 84 | 3.0.0 85 | 86 | 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /src/main/java/org/tutorial/App.java: -------------------------------------------------------------------------------- 1 | package org.tutorial; 2 | 3 | import org.tutorial.model.School; 4 | import org.tutorial.model.Student; 5 | import org.tutorial.model.Teacher; 6 | import org.tutorial.model.Tutor; 7 | import org.tutorial.repository.SchoolRepository; 8 | import org.tutorial.repository.StudentRepository; 9 | import org.tutorial.repository.TeacherRepository; 10 | import org.tutorial.repository.TutorRepository; 11 | 12 | import java.util.List; 13 | 14 | 15 | public class App { 16 | public static void main(String[] args) { 17 | 18 | Student student = new Student("Alan", "Red"); 19 | 20 | //REPOSITORIES 21 | 22 | StudentRepository studentRepository = new StudentRepository(); 23 | 24 | SchoolRepository schoolRepository = new SchoolRepository(); 25 | 26 | TutorRepository tutorRepository = new TutorRepository(); 27 | 28 | TeacherRepository teacherRepository = new TeacherRepository(); 29 | 30 | //ADD STUDENT 31 | 32 | studentRepository.add(student); 33 | 34 | System.out.println("Added student " + student.toString()); 35 | 36 | //ADD TUTOR 37 | 38 | Tutor tutor = new Tutor("FirstName_tutor_1", "LastName_tutor_2"); 39 | 40 | tutorRepository.add(tutor); 41 | 42 | System.out.println("Added tutor " + tutor.toString()); 43 | 44 | studentRepository.addTutor(student.getId(), tutor); 45 | 46 | System.out.println("Student with tutor " + student.toString()); 47 | 48 | System.out.println("Found student with school " + student.toString()); 49 | 50 | //ADD SCHOOL 51 | 52 | School school = new School("School_1","City_1"); 53 | 54 | schoolRepository.add(school); 55 | 56 | System.out.println("Added school " + school.toString()); 57 | 58 | school = schoolRepository.find(school.getId()); 59 | 60 | school.getStudents().forEach(System.out::println); 61 | 62 | school = schoolRepository.find(school.getId()); 63 | 64 | school.getStudents().forEach(System.out::println); 65 | 66 | //ADD TEACHER 67 | 68 | Teacher teacher = new Teacher("firstname_1","lastname_1"); 69 | 70 | teacher.addStudent(new Student("SFirstName_1", "SLastname_1")); 71 | teacher.addStudent(new Student("SFirstName_2", "SLastname_2")); 72 | 73 | teacherRepository.add(teacher); 74 | 75 | //Persistence Operations and JPQL 76 | 77 | studentRepository.findFirstNames().forEach(System.out::println); 78 | 79 | studentRepository.findLastNames().forEach(System.out::println); 80 | 81 | student = studentRepository.find(student.getId()); 82 | 83 | System.out.println("Found student " + student.toString()); 84 | 85 | student = studentRepository.findById(student.getId()); 86 | 87 | System.out.println("Found student (JPQL) " + student.toString()); 88 | 89 | student.setLastName("Green"); 90 | 91 | studentRepository.update(student); 92 | 93 | System.out.println("Updated student " + student.toString()); 94 | 95 | student = studentRepository.updateFirstNameById("Fred", student.getId()); 96 | 97 | System.out.println("Updated first name (JPQL)" + student.toString()); 98 | 99 | student = studentRepository.updateLastNameById("Yellow", student.getId()); 100 | 101 | System.out.println("Updated last name (JPQL)" + student.toString()); 102 | 103 | List students = studentRepository.findByFirstNameStartWith("Fr"); 104 | 105 | students.forEach(System.out::println); 106 | 107 | students = studentRepository.findByLastNameEndWith("ow"); 108 | 109 | students.forEach(System.out::println); 110 | 111 | System.out.println("Number of student(s): "+ studentRepository.count()); 112 | 113 | students = studentRepository.findSortingByFirstName(); 114 | 115 | students.forEach(System.out::println); 116 | 117 | students = studentRepository.findSortingById(); 118 | 119 | students.forEach(System.out::println); 120 | 121 | //repository.delete(student); 122 | 123 | //System.out.println("Deleted student " + student.toString()); 124 | 125 | 126 | //CRITERIA BUILDER 127 | 128 | List studentList = studentRepository.getStudentWithCriteriaBuilder(); 129 | 130 | System.out.println("Print Students (Criteria Builder): "); 131 | studentList.forEach(System.out::println); 132 | 133 | List studentListWhere = studentRepository.getStudentsWithWHEREFirstName(); 134 | 135 | System.out.println("Print Students (Criteria Builder with WHERE and GROUP BY): "); 136 | studentListWhere.forEach(System.out::println); 137 | 138 | studentRepository.close(); 139 | 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /src/main/java/org/tutorial/model/Person.java: -------------------------------------------------------------------------------- 1 | package org.tutorial.model; 2 | 3 | import javax.persistence.*; 4 | 5 | @Entity 6 | @Table 7 | @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 8 | public class Person { 9 | 10 | @Id 11 | @GeneratedValue(strategy = GenerationType.AUTO) 12 | private Long id; 13 | 14 | @Column(name = "first_name", nullable = false, length = 150) 15 | private String firstName; 16 | 17 | @Column(name = "last_name", nullable = false, length = 250) 18 | private String lastName; 19 | 20 | public Person(String firstName, String lastName) { 21 | this.firstName = firstName; 22 | this.lastName = lastName; 23 | } 24 | 25 | public Person() { 26 | } 27 | 28 | public Long getId() { 29 | return id; 30 | } 31 | 32 | public void setId(Long id) { 33 | this.id = id; 34 | } 35 | 36 | public String getFirstName() { 37 | return firstName; 38 | } 39 | 40 | public void setFirstName(String firstName) { 41 | this.firstName = firstName; 42 | } 43 | 44 | public String getLastName() { 45 | return lastName; 46 | } 47 | 48 | public void setLastName(String lastName) { 49 | this.lastName = lastName; 50 | } 51 | 52 | @Override 53 | public String toString() { 54 | return "{" + 55 | "id=" + id + 56 | ", firstName='" + firstName + '\'' + 57 | ", lastName='" + lastName + '\'' + 58 | '}'; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/org/tutorial/model/School.java: -------------------------------------------------------------------------------- 1 | package org.tutorial.model; 2 | 3 | import javax.persistence.*; 4 | import java.util.HashSet; 5 | import java.util.Set; 6 | 7 | @Entity 8 | public class School { 9 | 10 | @Id 11 | @GeneratedValue(strategy = GenerationType.AUTO) 12 | private Long id; 13 | private String name; 14 | private String city; 15 | 16 | @OneToMany(targetEntity = Student.class) 17 | private Set students = new HashSet<>(); 18 | 19 | public School(String name, String city) { 20 | this.name = name; 21 | this.city = city; 22 | } 23 | 24 | public School() { 25 | } 26 | 27 | public Long getId() { 28 | return id; 29 | } 30 | 31 | public void setId(Long id) { 32 | this.id = id; 33 | } 34 | 35 | public String getName() { 36 | return name; 37 | } 38 | 39 | public void setName(String name) { 40 | this.name = name; 41 | } 42 | 43 | public String getCity() { 44 | return city; 45 | } 46 | 47 | public void setCity(String city) { 48 | this.city = city; 49 | } 50 | 51 | @Override 52 | public String toString() { 53 | return "School{" + 54 | "id=" + id + 55 | ", name='" + name + '\'' + 56 | ", city='" + city + '\'' + 57 | '}'; 58 | } 59 | 60 | public Set getStudents() { 61 | return students; 62 | } 63 | 64 | public void setStudents(Set students) { 65 | this.students = students; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/org/tutorial/model/Student.java: -------------------------------------------------------------------------------- 1 | package org.tutorial.model; 2 | 3 | import javax.persistence.*; 4 | import java.util.HashSet; 5 | import java.util.Set; 6 | 7 | @Entity 8 | @NamedQuery(name = "find student by id" ,query = "Select s from Student s where s.id = :id") 9 | public class Student extends Person{ 10 | 11 | @OneToOne 12 | private Tutor tutor; 13 | 14 | @ManyToMany(mappedBy = "students") 15 | private Set teachers = new HashSet<>(); 16 | 17 | public Student(String firstName, String lastName) { 18 | super(firstName, lastName); 19 | } 20 | 21 | public Student() { 22 | } 23 | 24 | public void setTutor(Tutor tutor) { 25 | this.tutor = tutor; 26 | } 27 | 28 | public Tutor getTutor() { 29 | return tutor; 30 | } 31 | 32 | public void addTeacher(Teacher teacher) { 33 | boolean added = teachers.add(teacher); 34 | if (added) { 35 | teacher.getStudents().add(this); 36 | } 37 | } 38 | 39 | public void removeTeacher(Teacher teacher) { 40 | boolean remove = teachers.remove(teacher); 41 | if (remove) { 42 | teacher.getStudents().remove(this); 43 | } 44 | } 45 | 46 | public Set getTeachers() { 47 | return teachers; 48 | } 49 | 50 | public void setTeachers(Set teachers) { 51 | this.teachers = teachers; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/org/tutorial/model/Teacher.java: -------------------------------------------------------------------------------- 1 | package org.tutorial.model; 2 | 3 | import javax.persistence.*; 4 | import java.util.HashSet; 5 | import java.util.Set; 6 | 7 | @Entity 8 | public class Teacher extends Person{ 9 | 10 | @ManyToOne 11 | private School school; 12 | 13 | @ManyToMany(cascade = { 14 | CascadeType.PERSIST, 15 | CascadeType.MERGE 16 | }) 17 | @JoinTable( 18 | name = "teachers_students", 19 | joinColumns = { @JoinColumn(name = "teacher_id") }, 20 | inverseJoinColumns = { @JoinColumn(name = "student_id") }, 21 | uniqueConstraints = { 22 | @UniqueConstraint( 23 | columnNames = { "teacher_id", "student_id" } 24 | ) 25 | } 26 | 27 | ) 28 | private Set students = new HashSet<>(); 29 | 30 | public Teacher(String firstName, String lastName) { 31 | super(firstName, lastName); 32 | } 33 | 34 | public Teacher() { 35 | } 36 | 37 | public School getSchool() { 38 | return school; 39 | } 40 | 41 | public void setSchool(School school) { 42 | this.school = school; 43 | } 44 | 45 | public void addStudent(Student student) { 46 | boolean added = students.add(student); 47 | if(added) { 48 | student.getTeachers().add(this); 49 | } 50 | } 51 | 52 | public void removeStudent(Student student) { 53 | boolean removed = students.remove(student); 54 | if(removed) { 55 | student.getTeachers().remove(this); 56 | } 57 | } 58 | 59 | public Set getStudents() { 60 | return students; 61 | } 62 | 63 | public void setStudents(Set students) { 64 | this.students = students; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/org/tutorial/model/Tutor.java: -------------------------------------------------------------------------------- 1 | package org.tutorial.model; 2 | 3 | import javax.persistence.*; 4 | 5 | @Entity 6 | public class Tutor extends Person { 7 | public Tutor(String firstName, String lastName) { 8 | super(firstName, lastName); 9 | } 10 | 11 | public Tutor() { 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/tutorial/repository/SchoolRepository.java: -------------------------------------------------------------------------------- 1 | package org.tutorial.repository; 2 | 3 | import org.tutorial.model.School; 4 | 5 | import javax.persistence.EntityManager; 6 | import javax.persistence.EntityManagerFactory; 7 | import javax.persistence.Persistence; 8 | 9 | public class SchoolRepository { 10 | 11 | private EntityManager entityManager; 12 | private EntityManagerFactory emf; 13 | 14 | public SchoolRepository() { 15 | this.emf = Persistence.createEntityManagerFactory("student_pu"); 16 | this.entityManager = this.emf.createEntityManager(); 17 | } 18 | 19 | public SchoolRepository(String pu) { 20 | this.emf = Persistence.createEntityManagerFactory(pu); 21 | this.entityManager = this.emf.createEntityManager(); 22 | } 23 | 24 | public School add(School school) { 25 | entityManager.getTransaction().begin(); 26 | entityManager.persist(school); 27 | entityManager.getTransaction().commit(); 28 | return school; 29 | } 30 | 31 | public School find(Long id) { 32 | return entityManager.find(School.class, id); 33 | } 34 | 35 | public School update(School school) { 36 | School schoolToUpdate = find(school.getId()); 37 | entityManager.getTransaction().begin(); 38 | schoolToUpdate.setCity(school.getCity()); 39 | schoolToUpdate.setName(school.getName()); 40 | entityManager.getTransaction().commit(); 41 | return schoolToUpdate; 42 | } 43 | 44 | public void delete(School school) { 45 | entityManager.getTransaction().begin(); 46 | entityManager.remove(school); 47 | entityManager.getTransaction().commit(); 48 | } 49 | 50 | public void close() { 51 | this.entityManager.close(); 52 | this.emf.close(); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/org/tutorial/repository/StudentRepository.java: -------------------------------------------------------------------------------- 1 | package org.tutorial.repository; 2 | 3 | import org.tutorial.model.School; 4 | import org.tutorial.model.Student; 5 | import org.tutorial.model.Teacher; 6 | import org.tutorial.model.Tutor; 7 | 8 | import javax.persistence.*; 9 | import javax.persistence.criteria.*; 10 | import java.util.Arrays; 11 | import java.util.List; 12 | 13 | public class StudentRepository { 14 | 15 | private EntityManager entityManager; 16 | private EntityManagerFactory emf; 17 | 18 | public StudentRepository() { 19 | this.emf = Persistence.createEntityManagerFactory("student_pu"); 20 | this.entityManager = this.emf.createEntityManager(); 21 | } 22 | 23 | public StudentRepository(String pu) { 24 | this.emf = Persistence.createEntityManagerFactory(pu); 25 | this.entityManager = this.emf.createEntityManager(); 26 | } 27 | 28 | public Student add(Student student) { 29 | entityManager.getTransaction().begin(); 30 | entityManager.persist(student); 31 | entityManager.getTransaction().commit(); 32 | return student; 33 | } 34 | 35 | public Tutor addTutor(Long id, Tutor tutor) { 36 | entityManager.getTransaction().begin(); 37 | Student student = find(id); 38 | student.setTutor(tutor); 39 | entityManager.getTransaction().commit(); 40 | return tutor; 41 | } 42 | 43 | public Student find(Long id) { 44 | return entityManager.find(Student.class, id); 45 | } 46 | 47 | public Student findById(Long id) { 48 | Query query = entityManager.createNamedQuery("find student by id"); 49 | query.setParameter("id", id); 50 | return (Student) query.getSingleResult(); 51 | } 52 | 53 | public Student updateFirstNameById(String firstName, Long id) { 54 | entityManager.getTransaction().begin(); 55 | Query query = entityManager.createQuery("Update Student set firstName = '"+ firstName + "' where id = " + id ); 56 | query.executeUpdate(); 57 | entityManager.getTransaction().commit(); 58 | entityManager.clear(); 59 | return findById(id); 60 | } 61 | 62 | public Student updateLastNameById(String lastName, Long id) { 63 | entityManager.getTransaction().begin(); 64 | Query query = entityManager.createQuery("Update Student set lastName = '"+ lastName + "' where id = " + id ); 65 | query.executeUpdate(); 66 | entityManager.getTransaction().commit(); 67 | entityManager.clear(); 68 | return findById(id); 69 | } 70 | 71 | public void deleteById(Long id) { 72 | entityManager.getTransaction().begin(); 73 | Query query = entityManager.createQuery("Delete from Student where id =" + id); 74 | query.executeUpdate(); 75 | entityManager.getTransaction().commit(); 76 | } 77 | 78 | public List findByFirstNameStartWith(String keyword) { 79 | Query query = entityManager.createQuery("Select s from Student s where s.firstName like '" + keyword + "%'"); 80 | return query.getResultList(); 81 | } 82 | 83 | public List findByLastNameEndWith(String keyword) { 84 | Query query = entityManager.createQuery("Select s from Student s where s.lastName like '%" + keyword + "'"); 85 | return query.getResultList(); 86 | } 87 | 88 | public List findSortingByFirstName() { 89 | Query query = entityManager.createQuery("Select s from Student s order by s.firstName desc"); 90 | return query.getResultList(); 91 | } 92 | 93 | public List findSortingById() { 94 | Query query = entityManager.createQuery("Select s from Student s order by s.id desc"); 95 | return query.getResultList(); 96 | } 97 | 98 | public Long count() { 99 | Query query = entityManager.createQuery("Select count(s) from Student s"); 100 | return (Long) query.getSingleResult(); 101 | } 102 | 103 | public Student update(Student student) { 104 | Student studentToUpdate = find(student.getId()); 105 | entityManager.getTransaction().begin(); 106 | studentToUpdate.setFirstName(student.getFirstName()); 107 | studentToUpdate.setLastName(student.getLastName()); 108 | entityManager.getTransaction().commit(); 109 | return studentToUpdate; 110 | } 111 | 112 | public void delete(Student student) { 113 | entityManager.getTransaction().begin(); 114 | entityManager.remove(student); 115 | entityManager.getTransaction().commit(); 116 | } 117 | 118 | public List findFirstNames() { 119 | Query query = entityManager.createQuery("Select s.firstName from Student s"); 120 | return query.getResultList(); 121 | } 122 | 123 | public List findLastNames() { 124 | Query query = entityManager.createQuery("Select s.lastName from Student s"); 125 | return query.getResultList(); 126 | } 127 | 128 | public void addTeacher(Long id, Teacher teacher) { 129 | entityManager.getTransaction().begin(); 130 | Student student = find(id); 131 | if(student != null) { 132 | student.getTeachers().add(teacher); 133 | } 134 | entityManager.getTransaction().commit(); 135 | } 136 | 137 | public void removeTeacher(Long id, Teacher teacher) { 138 | Student student = find(id); 139 | if(student != null) { 140 | student.getTeachers().remove(teacher); 141 | } 142 | } 143 | 144 | public List getStudentWithCriteriaBuilder() { 145 | CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 146 | CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Student.class); 147 | 148 | Root studentRoot = criteriaQuery.from(Student.class); 149 | 150 | criteriaQuery.select(studentRoot.get("firstName")); 151 | criteriaQuery.distinct(true); 152 | criteriaQuery.orderBy(criteriaBuilder.desc(studentRoot.get("firstName"))); 153 | 154 | CriteriaQuery select = criteriaQuery.select(studentRoot); 155 | TypedQuery query = entityManager.createQuery(select); 156 | 157 | return query.getResultList(); 158 | } 159 | 160 | public List getStudentsWithWHEREFirstName() { 161 | 162 | CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 163 | CriteriaQuery query = criteriaBuilder.createQuery(Student.class); 164 | 165 | Root from = query.from(Student.class); 166 | 167 | List firstNameList = Arrays.asList(new String[]{"SFirstName_1","SFirstName_2"}); 168 | 169 | Expression exp = from.get("firstName"); 170 | Predicate in = exp.in(firstNameList); 171 | query.where(in); 172 | query.groupBy(from.get("lastName")); 173 | 174 | CriteriaQuery select = query.select(from); 175 | TypedQuery query1 = entityManager.createQuery(select); 176 | 177 | return query1.getResultList(); 178 | } 179 | 180 | 181 | public void close() { 182 | this.entityManager.close(); 183 | this.emf.close(); 184 | } 185 | } 186 | -------------------------------------------------------------------------------- /src/main/java/org/tutorial/repository/TeacherRepository.java: -------------------------------------------------------------------------------- 1 | package org.tutorial.repository; 2 | 3 | import org.tutorial.model.Student; 4 | import org.tutorial.model.Teacher; 5 | import org.tutorial.model.Tutor; 6 | 7 | import javax.persistence.EntityManager; 8 | import javax.persistence.EntityManagerFactory; 9 | import javax.persistence.Persistence; 10 | 11 | public class TeacherRepository { 12 | 13 | private EntityManager entityManager; 14 | private EntityManagerFactory emf; 15 | 16 | public TeacherRepository() { 17 | this.emf = Persistence.createEntityManagerFactory("student_pu"); 18 | this.entityManager = this.emf.createEntityManager(); 19 | } 20 | 21 | public TeacherRepository(String pu) { 22 | this.emf = Persistence.createEntityManagerFactory(pu); 23 | this.entityManager = this.emf.createEntityManager(); 24 | } 25 | 26 | public Teacher add(Teacher teacher) { 27 | entityManager.getTransaction().begin(); 28 | entityManager.persist(teacher); 29 | entityManager.getTransaction().commit(); 30 | return teacher; 31 | } 32 | 33 | public Teacher find(Long id) { 34 | return entityManager.find(Teacher.class, id); 35 | } 36 | 37 | public Teacher update(Tutor teacher) { 38 | Teacher teacherToUpdate = find(teacher.getId()); 39 | entityManager.getTransaction().begin(); 40 | teacherToUpdate.setLastName(teacher.getLastName()); 41 | teacherToUpdate.setFirstName(teacher.getFirstName()); 42 | entityManager.getTransaction().commit(); 43 | return teacherToUpdate; 44 | } 45 | 46 | public void delete(Teacher teacher) { 47 | entityManager.getTransaction().begin(); 48 | entityManager.remove(teacher); 49 | entityManager.getTransaction().commit(); 50 | } 51 | 52 | public void close() { 53 | this.entityManager.close(); 54 | this.emf.close(); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/org/tutorial/repository/TutorRepository.java: -------------------------------------------------------------------------------- 1 | package org.tutorial.repository; 2 | 3 | import org.tutorial.model.Tutor; 4 | 5 | import javax.persistence.EntityManager; 6 | import javax.persistence.EntityManagerFactory; 7 | import javax.persistence.Persistence; 8 | 9 | public class TutorRepository { 10 | 11 | private EntityManager entityManager; 12 | private EntityManagerFactory emf; 13 | 14 | public TutorRepository() { 15 | this.emf = Persistence.createEntityManagerFactory("student_pu"); 16 | this.entityManager = this.emf.createEntityManager(); 17 | } 18 | 19 | public TutorRepository(String pu) { 20 | this.emf = Persistence.createEntityManagerFactory(pu); 21 | this.entityManager = this.emf.createEntityManager(); 22 | } 23 | 24 | public Tutor add(Tutor tutor) { 25 | entityManager.getTransaction().begin(); 26 | entityManager.persist(tutor); 27 | entityManager.getTransaction().commit(); 28 | return tutor; 29 | } 30 | 31 | public Tutor find(Long id) { 32 | return entityManager.find(Tutor.class, id); 33 | } 34 | 35 | public Tutor update(Tutor tutor) { 36 | Tutor tutorToUpdate = find(tutor.getId()); 37 | entityManager.getTransaction().begin(); 38 | tutorToUpdate.setLastName(tutor.getLastName()); 39 | tutorToUpdate.setFirstName(tutor.getFirstName()); 40 | entityManager.getTransaction().commit(); 41 | return tutorToUpdate; 42 | } 43 | 44 | public void delete(Tutor tutor) { 45 | entityManager.getTransaction().begin(); 46 | entityManager.remove(tutor); 47 | entityManager.getTransaction().commit(); 48 | } 49 | 50 | public void close() { 51 | this.entityManager.close(); 52 | this.emf.close(); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/persistence.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | org.hibernate.jpa.HibernatePersistenceProvider 4 | 5 | org.tutorial.model.Person 6 | org.tutorial.model.Student 7 | org.tutorial.model.School 8 | org.tutorial.model.Tutor 9 | org.tutorial.model.Teacher 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/test/java/org/tutorial/AppTest.java: -------------------------------------------------------------------------------- 1 | package org.tutorial; 2 | 3 | import static org.junit.Assert.assertTrue; 4 | 5 | import org.junit.Test; 6 | 7 | /** 8 | * Unit test for simple App. 9 | */ 10 | public class AppTest 11 | { 12 | /** 13 | * Rigorous Test :-) 14 | */ 15 | @Test 16 | public void shouldAnswerWithTrue() 17 | { 18 | assertTrue( true ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/test/java/org/tutorial/StudentRepositoryTest.java: -------------------------------------------------------------------------------- 1 | package org.tutorial; 2 | 3 | import org.junit.*; 4 | import org.tutorial.model.Student; 5 | import org.tutorial.repository.StudentRepository; 6 | 7 | import static org.junit.Assert.*; 8 | 9 | 10 | public class StudentRepositoryTest { 11 | 12 | private static StudentRepository repository; 13 | 14 | @BeforeClass 15 | public static void beforeClass() { 16 | repository = new StudentRepository("student_pu_test"); 17 | } 18 | 19 | @AfterClass 20 | public static void afterClass() { 21 | repository.close(); 22 | } 23 | 24 | @Before 25 | public void setUp() {} 26 | 27 | @After 28 | public void tearDown() {} 29 | 30 | @Test 31 | public void add() { 32 | Student student = new Student("Red", "Alan"); 33 | student.setLastName("Red"); 34 | student.setFirstName("Alan"); 35 | 36 | repository.add(student); 37 | 38 | assertNotNull(student.getId()); 39 | assertNotNull(student.getId()); 40 | } 41 | 42 | @Test 43 | public void find() { 44 | Student student = new Student("Red", "Alan"); 45 | 46 | repository.add(student); 47 | 48 | student = repository.find(student.getId()); 49 | 50 | assertNotNull(student); 51 | assertNotNull(student.getId()); 52 | assertEquals("Alan", student.getLastName()); 53 | } 54 | 55 | @Test 56 | public void update() { 57 | Student student = new Student("Red", "Alan"); 58 | 59 | student = repository.add(student); 60 | 61 | student.setLastName("Green"); 62 | student = repository.update(student); 63 | 64 | assertNotNull(student); 65 | assertEquals("Green", student.getLastName()); 66 | assertEquals("Red", student.getFirstName()); 67 | 68 | } 69 | 70 | @Test 71 | public void delete() { 72 | Student student = new Student("Red", "Alan"); 73 | 74 | student = repository.add(student); 75 | 76 | repository.delete(student); 77 | 78 | student = repository.find(student.getId()); 79 | 80 | assertNull(student); 81 | 82 | } 83 | 84 | 85 | } -------------------------------------------------------------------------------- /src/test/resources/META-INF/persistence.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | org.hibernate.jpa.HibernatePersistenceProvider 4 | 5 | org.tutorial.model.Person 6 | org.tutorial.model.Student 7 | org.tutorial.model.School 8 | org.tutorial.model.Tutor 9 | org.tutorial.model.Teacher 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | --------------------------------------------------------------------------------