<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Laman Asfarova</title>
    <description>The latest articles on DEV Community by Laman Asfarova (@lamanasfar).</description>
    <link>https://dev.to/lamanasfar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4142912%2F31e3bfd6-396a-454b-89a3-95f05f3c3707.png</url>
      <title>DEV Community: Laman Asfarova</title>
      <link>https://dev.to/lamanasfar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lamanasfar"/>
    <language>en</language>
    <item>
      <title>LazyInitializationException-necə həll etdim?</title>
      <dc:creator>Laman Asfarova</dc:creator>
      <pubDate>Fri, 25 Sep 2026 14:38:22 +0000</pubDate>
      <link>https://dev.to/lamanasfar/lazyinitializationexception-nec-hll-etdim-145o</link>
      <guid>https://dev.to/lamanasfar/lazyinitializationexception-nec-hll-etdim-145o</guid>
      <description>&lt;p&gt;Bugün layihəmdə qarşılaşdığım problem: LazyInitializationException&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem nədən qaynaqlandı?
&lt;/h2&gt;

&lt;p&gt;Səbəb çox aydın idi. Belə bir problemin yaşanması üçün ən azı 2 entity və onlar arasında ən azı 1 relation olması, həmin relation-un da &lt;code&gt;FetchType.LAZY&lt;/code&gt; olması lazım idi.&lt;/p&gt;

&lt;p&gt;Günahkarları tapdım)&lt;/p&gt;

&lt;p&gt;Sonra düşündüm ki, bunu necə həll edə bilərəm və araşdırmağa başladım.&lt;/p&gt;

&lt;p&gt;Ağlıma ilk 2 üsul gəldi:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;FetchType = EAGER&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Transactional&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. FetchType = EAGER
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;FetchType.EAGER&lt;/code&gt; etsəm, relation hər dəfə lazım olmasa belə yüklənə bilərdi.&lt;/p&gt;

&lt;p&gt;Layihə böyüdükcə bunun əlavə yüklənmə yaratması ehtimalı var idi. Ona görə bunu istəmədim.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. @Transactional
&lt;/h2&gt;

&lt;p&gt;İkinci üsul — &lt;code&gt;@Transactional&lt;/code&gt; — ilk başda mənə ən məntiqli gəldi.&lt;/p&gt;

&lt;p&gt;Bir az da tənbəllik var idi, ən rahat yol bu idi,mən də tətbiq etdim&lt;/p&gt;

&lt;p&gt;Amma sonra başqa problem çıxdı.&lt;/p&gt;

&lt;p&gt;Metodumda findAll() nəticəsində entity-lər gəlirdi. Daha sonra ExpenseMapper daxilində relation-a müraciət etdikcə hər entity üçün yenidən bazaya sorğu gedirdi.&lt;/p&gt;

&lt;p&gt;Hər yerdə buna &lt;strong&gt;N+1 problem&lt;/strong&gt; deyirlər.&lt;br&gt;
&lt;strong&gt;1 əsas sorğu + N əlavə sorğu.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nəticədə &lt;code&gt;@Transactional&lt;/code&gt; &lt;code&gt;LazyInitializationException&lt;/code&gt; problemini həll etsə də, database-ə lazımsız sayda sorğu göndərilməsinə səbəb oldu.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. JPQL + JOIN FETCH
&lt;/h2&gt;

&lt;p&gt;Bu üsul da pis deyil. Relation-u lazım olan query ilə birlikdə gətirmək mümkündür.&lt;/p&gt;

&lt;p&gt;1 relation olduğuna görə də böyük yüklənməyə səbəb olmayacaqdı.Lakin JPQL-lərin sayı artsa,həm yavaşlanmaya səbəb olacaqdı,həm də oxunaqlılıq itəcəkdi.&lt;br&gt;
Bir tərəfdən problemi həll edəcəkdi, digər tərəfdən mən query-yə baxıb:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Mən burada nə yazmışam?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;deyəcəkdim.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. EntityGraph
&lt;/h2&gt;

&lt;p&gt;Sonda &lt;code&gt;EntityGraph&lt;/code&gt; variantını seçdim.&lt;/p&gt;

&lt;p&gt;Səliqəli, oxunaqlıdır və hansı relation-u konkret query-də yükləmək istədiyimi göstərə bilirəm.&lt;/p&gt;

&lt;p&gt;Ən əsası da &lt;code&gt;FetchType.LAZY&lt;/code&gt;-ni ümumi olaraq dəyişmədən, yalnız ehtiyacım olan yerdə relation-u yükləyə bilirəm.&lt;/p&gt;

&lt;p&gt;Mənim konkret vəziyyətim üçün ən uyğun variant bu oldu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@EntityGraph&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attributePaths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"expenseType"&lt;/span&gt;&lt;span class="o"&gt;})&lt;/span&gt;
&lt;span class="nc"&gt;Page&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ExpenseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;Specification&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ExpenseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;spec&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nc"&gt;Pageable&lt;/span&gt; &lt;span class="n"&gt;pageable&lt;/span&gt;
&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. DTO
&lt;/h2&gt;

&lt;p&gt;Bir də DTO ilə bağlı yanaşma var idi.&lt;/p&gt;

&lt;p&gt;İşləyirsə, çox da qurdalamaq lazım deyil deyib, tənbəllik etdim və araşdırıb tətbiq etmədim. &lt;/p&gt;

&lt;p&gt;Bəlkə növbəti dəfə.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bugünkü nəticə
&lt;/h2&gt;

&lt;p&gt;Bir problemi həll edəndə təkcə &lt;strong&gt;“işləyir?”&lt;/strong&gt; sualını yox, &lt;strong&gt;“bunu həll edəndə başqa problem yaratdım?”&lt;/strong&gt; sualını da vermək lazımdır.&lt;/p&gt;

&lt;p&gt;Bu gün də &lt;code&gt;LazyInitializationException&lt;/code&gt; mənə bunu öyrətdi.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bəs AI bu prosesdə necə kömək etdi?
&lt;/h2&gt;

&lt;p&gt;Son olaraq bir şeyi də qeyd edim.&lt;/p&gt;

&lt;p&gt;Bu variantları araşdırarkən AI-dan da istifadə etdim. Maraqlısı odur ki, AI mənə sırasıyla:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;FetchType.EAGER&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Transactional&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;JPQL + JOIN FETCH&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;variantlarını təklif etdi.&lt;/p&gt;

&lt;p&gt;Amma &lt;code&gt;EntityGraph&lt;/code&gt; ümumiyyətlə təklif olunmadı.&lt;/p&gt;

&lt;p&gt;Göründüyü kimi, verilən ilk cavabı birbaşa götürüb tətbiq etmək həmişə ən yaxşı yol deyil.&lt;/p&gt;

&lt;p&gt;Mənim üçün əsas məsələ də elə bu oldu: təklif olunan hər üsulun nə etdiyini, hansı problemin yarana biləcəyini başa düşmək və sonra öz layihəmə uyğun qərar vermək.&lt;/p&gt;

&lt;p&gt;Sonda &lt;code&gt;EntityGraph&lt;/code&gt;-ı özüm tapdım və konkret vəziyyətim üçün daha uyğun olduğunu düşündüm.&lt;/p&gt;

&lt;p&gt;Yəni AI çox kömək edir, amma &lt;strong&gt;“AI belə dedi, deməli belədir”&lt;/strong&gt; yanaşması ilə işləmək də düzgün deyil.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kodun məsuliyyəti yenə mənim üzərimdədir. :)&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>exceptions</category>
      <category>solvingproblem</category>
      <category>differentways</category>
    </item>
  </channel>
</rss>
