N+1 problem. Fetch types. @Transactional annotation

 @OneToMany ve @ManyToMany - de eger fetch type EAGER -dirse o zaman N + 1 problemi ortaya cixir. N + 1 o demkdirki Many terefde ne qeder obyekt varsa hamisini cekib getirir ve her birisi ucun ayrica query icra olunur. Bunun qarshisini almaq ucun fetch type LAZY qoyulur ve @Transactional annotation istifade olunur. 


1-ci situasiyada butun query-ler iwleyir sonra cap olunur.

2-ci situasiyada ise lazim olduqca query-ler iwleyir.


Solutions for N + 1 problem.

1. Join Fetch

public interface CourseRepository extends JpaRepository<Course, Long> {

// JPQL java persistence query language
@Query(value = "select c from Course c join fetch c.students s")
List<Course> getAllCourses();
}
Bu zaman cemi bir defe Hibernate query generate edecek. 

2. NamedEntityGraph
EntityGraphType iki cur olur: FETCH ve LOAD
FETCH - qeyd olunubsa o zaman value = "something" qeyd olunanlari EAGER weklinde getirir,
qalanlarini ise LAZY weklinde getirir. Hetta hemin fieldlere EAGER verilse bele yene lazy 
olacaq.
LOAD - qeyd olunubsa o zaman value = "something" qeyd olunanlari EAGER weklinde getirir, 
qalanlari ise nece qeyd olunubsa hemin wekilde getir. 
@Entity
@Table(name = "courses")
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
//@ToString(exclude = "students")
@NamedEntityGraph(name = "course-students-entity-graph",
attributeNodes = {@NamedAttributeNode("students")})
public class Course {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
String name;

@OneToMany(mappedBy = "course", cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
List<Student> students;

public Student getStudent() {
return students.stream().findFirst().orElseThrow();
}
}
// NamedEntityGraph
@EntityGraph(type = EntityGraph.EntityGraphType.FETCH, value = "course-students-entity-graph")
List<Course> getAllBy();
Burada diqqet edeceyimiz meqam: getAllBy() weklinde yazmaliyiq eks halda iwlemeyecek.

3. EntityGraph
// EntityGraph
@EntityGraph(type = EntityGraph.EntityGraphType.FETCH, attributePaths = "students")
List<Course> getAllBy();



Комментарии

Популярные сообщения из этого блога

Lesson1: JDK, JVM, JRE

SE_21_Lesson_11: Inheritance, Polymorphism

SE_21_Lesson_9: Initialization Blocks, Wrapper types, String class