Napa sampeyan butuh cache query

Ayo nulis ulang conto karo entuk karyawan ing HQL:

Employee director1 = session.createQuery("from Employee where id = 4").uniqueResult();
Employee director2 = session.createQuery("from Employee where id = 4").uniqueResult();

assertTrue(director1 != director2);

Asil pitakon kasebut ora disimpen ing cache tingkat pertama utawa kapindho.

Iki persis ing ngendi cache query bisa digunakake . Iku uga dipatèni minangka standar. Kanggo ngaktifake, tambahake baris ing ngisor iki menyang file konfigurasi:

<property name="hibernate.cache.use_query_cache" value="true"/>

Nanging iki mung setengah solusi. Kita wis ngaktifake cache query, nanging kita uga kudu nemtokake asil query sing pengin disimpen. Iki kudu ditulis ing Query:

Query query = session.createQuery("from Employee where id = 4");
query.setCacheable(true);
Employee director1 = query.uniqueResult();

Cache query padha karo cache tingkat kapindho. Nanging, ora kaya, ing kene kunci data cache dudu pengenal obyek, nanging paramèter query. Lan data kasebut minangka pengenal obyek sing cocog karo kritéria pitakon. Mangkono, iku nyoto nggunakake cache iki karo cache tingkat kapindho.

Mbusak cache

Salah sawijining tugas penting nalika nggarap cache yaiku kanggo mesthekake yen obyek sing di-cache diganti lan mbusak saka cache (utawa nganyari). Hibernate nindakake iki kanthi apik. Kadhangkala malah katon yen dheweke dipandu dening aturan "mbusak cache ing kahanan sing ora bisa dingerteni."

Contone, sampeyan pengin nganyari data pangguna liwat HQL:

Query query = session.createQuery("update Employee set name=’Alex’ where id = 4")
query. executeUpdate();

Hibernate ora bisa ngerti persis apa wis diganti ing database, nanging ngerti sing ngganti obyek Karyawan. Mula, sawise nglakokake pitakon iki, Hibernate bakal mbusak kabeh obyek saka jinis Karyawan saka cache.

Nanging NativeQuery malah luwih menarik:

Query nativeQuery = session.createNativeQuery("update employee set name=’Alex’ where id = 4")
nativeQuery.executeUpdate();

A query SQL native kanggo database wis kaleksanan. Iki tegese ana sing diganti ing database - panjaluk kasebut diarani metode executeUpdate () . Mulane, ing kasus iki, Hibernate bakal muter aman lan mbusak kabeh obyek saka kabeh jinis saka cache sawijining .

Kepriye sampeyan seneng? Sampeyan nelpon panjalukan sing ora mbebayani, lan Hibernate nanggepi mbusak kabeh data saka cache! Iki mesthi luwih apik tinimbang yen dheweke nyimpen obyek sing beda karo dhasar, nanging mung!

Mula, para pangripta Hibernate kanthi cepet ngerti carane mbantu Hibernate ing kasus iki. Sampeyan bisa nemtokake jinis entitas sing kudu dibusak saka cache:

Query nativeQuery = session.createNativeQuery("update employee set name=’Alex’ where id = 4");
nativeQuery.unwrap(org.hibernate.SQLQuery.class).addSynchronizedEntityClass(Employee.class);
nativeQuery.executeUpdate();
Cathetan . Pitakonan pilihan asli ora ngilangake cache , mung nglebokake, nganyari, mbusak, panggilan prosedur, lsp.

Mbusak cache manual

Kanggo alasan tartamtu, sampeyan bisa uga pengin mbusak obyek saka cache dhewe. Iki bisa ditindakake kanthi cara sing beda-beda.

Cathetan . Obyek ing cache disimpen ing grup sing disebut wilayah . Secara default, jeneng wilayah padha karo jeneng kelas. Mulane, yen sampeyan duwe obyek jinis com.codegym.Employee , banjur kabeh mau bakal disimpen ing grup (wilayah) kanthi jeneng " com.codegym.employee ".

Yen sampeyan pengin ngakses cache lan nindakake apa wae, sampeyan bisa nindakake kanthi obyek SessionFactory lan metode getCache () :

session.getSessionFactory().getCache().evictQueryRegion("com.codegym.employee”);

Yen sampeyan pengin mbusak data saka kabeh klompok (wilayah), sampeyan kudu mbukak pitakon ing ngisor iki:

session.getSessionFactory().getCache().evictAllRegions();

Kanggo mbusak siji obyek saka cache, sampeyan kudu menehi jeneng (jinis) lan id. Sampeyan bisa nindakake iki kanthi rong cara:

session.getSessionFactory().getCache().evictEntityData("Employee, 4);

session.getSessionFactory().getCache().evictEntityData(com.codegym.Employee.class, 4);

Sampeyan uga bisa mriksa manawa obyek tartamtu ana ing cache:

session.getSessionFactory().getCache().containsEntity("Employee, 4);
session.getSessionFactory().getCache().containsEntity(com.codegym.Employee.class, 4);