คำอธิบายประกอบ
Hibernate Annotation เป็นวิธีล่าสุดที่ไม่ได้ใช้ไฟล์ XML เพื่อกำหนดการแมป คำอธิบายประกอบสามารถใช้ในข้อมูลเมตาการทำแผนที่ XML ที่แยกออกจากกันหรือแทนที่
คำอธิบายประกอบของ Hibernate เป็นวิธีที่ทรงพลังในการจัดทำแมปของวัตถุข้อมูลเมตาและตารางเชิงสัมพันธ์ ข้อมูลเมตาทั้งหมดเป็นที่นิยมร่วมกับไฟล์ Pojo Java สิ่งนี้สามารถช่วยให้ผู้ใช้เข้าใจโครงสร้างของตารางและ pojo ในระหว่างกระบวนการพัฒนา
หากคุณตั้งใจที่จะพอร์ตแอปพลิเคชันไปยังแอปพลิเคชัน ORM เฉพาะ EJB3 อื่น ๆ คุณต้องใช้คำอธิบายประกอบเพื่อแสดงข้อมูลการแมป แต่ถ้าคุณต้องการความยืดหยุ่นมากขึ้นคุณควรใช้การแมปที่ใช้ XML
การตั้งค่าคำอธิบายประกอบไฮเบอร์เนตในสภาพแวดล้อมก่อนคุณต้องตรวจสอบให้แน่ใจว่าคุณใช้ JDK5.0 มิฉะนั้นคุณจะต้องอัพเกรด JDK เป็น JDK5.0 การสนับสนุนดั้งเดิมด้วยคำอธิบายประกอบ
ประการที่สองคุณต้องติดตั้งแพ็คเกจการกระจายคำอธิบายประกอบ 3.x ของ Hibernate คุณสามารถใช้ SourceForge: (ดาวน์โหลดคำอธิบายประกอบฮิเบอร์เนต) และคัดลอก Hibernate-Annotations.jar, lib/hibernate-comons-annotations.jar และ lib/ejb3
แสดงความคิดเห็นอินสแตนซ์คลาส:
ดังที่ได้กล่าวมาแล้วข้อมูลเมตาทั้งหมดที่ทำงานร่วมกับคำอธิบายประกอบ Hibernate ในไฟล์ Pojo Java ด้านบนนี้จะช่วยให้ผู้ใช้เข้าใจทั้งโครงสร้างตารางและ Pojo ในระหว่างการพัฒนา
พิจารณาวัตถุที่จะเก็บไว้โดยใช้ตารางพนักงานต่อไปนี้:
สร้างพนักงานตาราง (ID int ไม่ใช่ null auto_increment, first_name varchar (20) ค่าเริ่มต้น null, last_name varchar (20) ค่าเริ่มต้น null, เงินเดือน int เริ่มต้น null, คีย์หลัก (id));
ต่อไปนี้คือการแมปของคลาสพนักงานวัตถุที่มีคำอธิบายประกอบเพื่อทำแผนที่ด้วยตารางพนักงานที่กำหนดไว้:
นำเข้า javax.persistence.*; @entity @table (name = "พนักงาน") พนักงานชั้นเรียนสาธารณะ {@id @id @generatedValue @column (name = "id") ID int ส่วนตัว; @column (name = "first_name") สตริงส่วนตัว FIRSNAME; @column (name = "last_name") สตริงส่วนตัวนามสกุล; @column (name = "เงินเดือน") เงินเดือนส่วนตัว พนักงานสาธารณะ () {} public int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สตริงสาธารณะ getFirstName () {return firstName; } โมฆะสาธารณะ setFirstName (สตริง first_name) {this.firstName = first_name; } สตริงสาธารณะ getLaStName () {return lastName; } โมฆะสาธารณะ setLastName (สตริง last_name) {this.lastName = last_name; } public int getalary () {คืนเงินเดือน; } โมฆะสาธารณะ setSalary (เงินเดือน int) {this.salary = เงินเดือน; -Hibernate ตรวจพบว่าคำอธิบายประกอบ @ID นั้นขัดต่อฟิลด์และสันนิษฐานว่าควรเข้าถึงคุณสมบัติของวัตถุโดยตรงผ่านโดเมนรันไทม์ หาก @ID มีคำอธิบายประกอบด้วยวิธี getId () คุณสมบัติจะถูกเข้าถึงโดยค่าเริ่มต้นผ่านวิธี getter และ setter ดังนั้นความคิดเห็นอื่น ๆ ทั้งหมดจะถูกวางไว้ในทั้งฟิลด์หรือวิธี getter ตามที่เลือกไว้ด้านล่างนโยบาย ส่วนต่อไปนี้อธิบายความคิดเห็นที่ใช้ในคลาสข้างต้น
@ENTITY คำอธิบายประกอบ:
คำอธิบายข้อมูลจำเพาะ EJB3 รวมอยู่ในแพ็คเกจ Javax.persistence ดังนั้นเราจึงนำเข้าแพ็คเกจนี้เป็นขั้นตอนแรก ประการที่สองเราใช้คำอธิบายประกอบ @Entity เพื่อทำเครื่องหมายคลาสนี้เป็นคลาสพนักงานของ Entity Bean ดังนั้นจึงต้องมีตัวสร้างแบบไม่มีพารามิเตอร์ซึ่งในที่สุดก็สามารถมองเห็นได้ด้วยการป้องกัน
@Table Annotation:
คำอธิบายประกอบ @Table อนุญาตให้ใช้ตารางที่ระบุเพื่อใช้ข้อมูลรายละเอียดเกี่ยวกับเอนทิตีในฐานข้อมูล
คำอธิบายประกอบ @Table มีคุณสมบัติสี่ประการที่อนุญาตให้เอาชนะชื่อของตารางไดเรกทอรีสคีมาและดำเนินการ จำกัด ข้อ จำกัด ที่ไม่ซ้ำกันในคอลัมน์ในตาราง ตอนนี้เรากำลังใช้ชื่อตารางพนักงานตอนนี้
@ID และ @GeneratedValue Annotations:
แต่ละเอนทิตีถั่วจะมีคีย์หลักที่มีคำอธิบายประกอบในคำอธิบายประกอบ @ID ของชั้นเรียน คีย์หลักสามารถเป็นฟิลด์เดียวหรือการรวมกันของหลายฟิลด์ตามโครงสร้างตาราง
โดยค่าเริ่มต้นคำอธิบายประกอบ @ID จะกำหนดกลยุทธ์การสร้างคีย์หลักที่เหมาะสมที่สุดโดยอัตโนมัติ แต่สามารถใช้งานได้โดยการใช้คำอธิบายประกอบ @GeneratedValue ซึ่งยอมรับพารามิเตอร์กลยุทธ์และเครื่องกำเนิดไฟฟ้าสองตัวที่จะไม่กล่าวถึงที่นี่เพียงแค่ใช้กลยุทธ์การสร้างคีย์เริ่มต้นเริ่มต้น ให้ไฮเบอร์เนตกำหนดประเภทเครื่องกำเนิดไฟฟ้าเพื่อใช้เพื่อให้รหัสพกพาระหว่างฐานข้อมูลที่แตกต่างกัน
@Column Annotation:
คำอธิบายประกอบ @column ใช้เพื่อระบุรายละเอียดของคอลัมน์ไปยังฟิลด์หรือคุณสมบัติที่จะแมป คุณสมบัติที่ใช้กันมากที่สุดต่อไปนี้สามารถใส่คำอธิบายประกอบได้โดยใช้คอลัมน์:
แอตทริบิวต์ชื่ออนุญาตให้ระบุชื่อของคอลัมน์อย่างชัดเจน
คุณสมบัติความยาวช่วยให้แมปขนาดของคอลัมน์ที่มีค่าสตริงโดยเฉพาะ
คุณสมบัติที่ไม่มีค่าใช้จ่ายอนุญาตให้ทำเครื่องหมายคอลัมน์ไม่ได้เมื่อสร้างสคีมา
คุณสมบัติที่ไม่ซ้ำกันอนุญาตให้คอลัมน์ทำเครื่องหมายว่ามีค่าที่ไม่ซ้ำกันเท่านั้น
สร้างคลาสแอปพลิเคชัน:
ในที่สุดเราจะสร้างวิธีการหลัก () ของคลาสแอปพลิเคชันเพื่อเรียกใช้แอปพลิเคชัน เราจะใช้แอพนี้เพื่อบันทึกระเบียนพนักงานบางอย่างจากนั้นเราจะสมัครบันทึกการดำเนินงาน CRUD
นำเข้า java.util.list; นำเข้า java.util.date; นำเข้า java.util.iterator; นำเข้า org.hibernate.HibernateException; นำเข้า org.hibernate.session; นำเข้า org.hibernate.transaction; นำเข้า org.hibernate.cfg.annotationconfiguration; นำเข้า org.hibernate.sessionfactory; นำเข้า org.hibernate.cfg.configuration; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ลอง {Factory = New AnnotationConfiguration () กำหนดค่า () //addpackage("com.xyz ") // เพิ่มแพ็คเกจหากใช้ AddanNotatedClass (ExplueE.class) BuildSessionFactory (); } catch (throwable ex) {system.err.println ("ล้มเหลวในการสร้างวัตถุ SessionFactory" + ex); โยนข้อยกเว้นใหม่ IniniNitializerError (EX); } managemployee me = new Managemployee (); / * เพิ่มระเบียนพนักงานไม่กี่รายในฐานข้อมูล */ จำนวนเต็ม EMPID1 = Me.addemployee ("Zara", "Ali", 1000); จำนวนเต็ม Empid2 = me.addemployee ("Daisy", "Das", 5000); จำนวนเต็ม empid3 = me.addemployee ("John", "Paul", 10,000); / * แสดงรายการพนักงานทั้งหมด */ me.listemployee (); / * อัปเดตบันทึกของพนักงาน */ me.updateemployee (EMPID1, 5000); / * ลบพนักงานจากฐานข้อมูล */ me.deleteEmployee (EMPID2); / * แสดงรายการใหม่ของพนักงาน */ me.listemployee (); } / * วิธีการสร้างพนักงานในฐานข้อมูล * / addemployee จำนวนเต็มสาธารณะ (สตริง fname, สตริง lname, เงินเดือน int) {เซสชันเซสชัน = factory.opensession (); ธุรกรรม tx = null; จำนวนเต็ม EmployeeId = null; ลอง {tx = session.beginTransaction (); พนักงานพนักงานพนักงาน = พนักงานใหม่ (); Employee.SetFirstName (FNAME); พนักงาน. setLastName (lName); พนักงาน. Setsalary (เงินเดือน); EmployeeId = (จำนวนเต็ม) เซสชั่น SAVE (พนักงาน); tx.commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); } return EmployeeId; } / * วิธีการอ่านพนักงานทั้งหมด * / โมฆะสาธารณะ Listemployees () {เซสชันเซสชัน = factory.opensession (); ธุรกรรม tx = null; ลอง {tx = session.beginTransaction (); รายการพนักงาน = เซสชัน. createquery ("จากพนักงาน"). list (); สำหรับ (iterator iterator = พนักงาน. titerator (); iterator.hasnext ();) {พนักงานพนักงาน = (พนักงาน) iterator.next (); System.out.print ("ชื่อแรก:" + Employee.getFirstName ()); System.out.print ("นามสกุล:" + Employee.getLastName ()); System.out.println ("เงินเดือน:" + Employee.getSalary ()); } tx.Commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); }} / * วิธีการอัปเดตเงินเดือนสำหรับพนักงาน * / โมฆะสาธารณะอัพเดต public updateMployee (จำนวนเต็ม EmployeeId, เงินเดือน int) {เซสชันเซสชัน = factory.opensession (); ธุรกรรม tx = null; ลอง {tx = session.beginTransaction (); พนักงานพนักงานพนักงาน = (พนักงาน) เซสชั่น get (Employee.class, EmployeeId); พนักงาน. Setsalary (เงินเดือน); session.update (พนักงาน); tx.commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); }} / * วิธีการลบพนักงานออกจากบันทึก * / โมฆะสาธารณะ deleteemployee (จำนวนเต็ม EmployeeId) {เซสชันเซสชัน = factory.opensession (); ธุรกรรม tx = null; ลอง {tx = session.beginTransaction (); พนักงานพนักงานพนักงาน = (พนักงาน) เซสชั่น get (Employee.class, EmployeeId); session.delete (พนักงาน); tx.commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); - การกำหนดค่าฐานข้อมูล:
ทีนี้มาสร้างไฟล์กำหนดค่า hibernate.cfg.xml เพื่อกำหนดพารามิเตอร์ที่เกี่ยวข้องของฐานข้อมูล
<? XML เวอร์ชัน = "1.0" การเข้ารหัส = "UTF-8"?> <! Doctype Hibernate-Configuration System "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> org.hibernate.dialect.mysqldialect </คุณสมบัติ> <property name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </คุณสมบัติ> <! name = "hibernate.connection.username"> root </property> <property name = "hibernate.connection.password"> cohondob </property>
รวบรวมและดำเนินการ:
นี่คือขั้นตอนในการรวบรวมและเรียกใช้แอปพลิเคชันด้านบน ตรวจสอบให้แน่ใจว่ามีการตั้งค่าเส้นทางและ classpath อย่างเหมาะสมก่อนที่จะรวบรวมและดำเนินการ
ลบไฟล์การแมป Employee.hbm.xml ออกจากเส้นทาง
สร้างไฟล์ต้นฉบับของพนักงาน. java ตามที่แสดงในภาพด้านบนและรวบรวม
สร้างไฟล์ต้นฉบับ managemployee.java ดังแสดงในอิมเมจด้านบนและรวบรวม
เรียกใช้ไฟล์ไบนารี managemployee เพื่อเรียกใช้โปรแกรม
ผลลัพธ์ต่อไปนี้จะได้รับและบันทึกจะอยู่ในตารางพนักงาน
$ java managemployee ......... ข้อความบันทึกต่าง ๆ จะแสดงที่นี่ ......... ชื่อแรก: Zara นามสกุล: Ali เงินเดือน: 1000 ชื่อชื่อ: Daisy นามสกุล: Das เงินเดือน: 5000 First Name: John Last Name: Paul: 10000 First Name: Zara ชื่อสุดท้าย: ALI
หากคุณตรวจสอบตารางพนักงานควรมีบันทึกต่อไปนี้:
mysql> เลือก * จากพนักงาน;+----+------------+-----------+--------+| id | first_name | Last_name | เงินเดือน |+----+------------+-----------+--------+| 29 | Zara | อาลี | 5000 || 31 | จอห์น | พอล | 10000 |+----+------------+-----------+--------+2 แถวในชุด (0.00 secmysql>
แคช
การแคชเป็นเรื่องเกี่ยวกับการเพิ่มประสิทธิภาพประสิทธิภาพของแอปพลิเคชันและอยู่ระหว่างแอปพลิเคชันและฐานข้อมูลเพื่อหลีกเลี่ยงการเข้าถึงฐานข้อมูลที่หลากหลายและอนุญาตให้แอปพลิเคชันที่สำคัญต่อประสิทธิภาพทำงานได้ดีขึ้น
การแคชเป็นสิ่งสำคัญสำหรับไฮเบอร์เนตและใช้รูปแบบการแคชหลายระดับที่อธิบายไว้ด้านล่าง:
แคชระดับ 1:
แคชระดับแรกคือแคชเซสชันซึ่งเป็นแคชบังคับและคำขอทั้งหมดผ่านมันจะต้องผ่าน วัตถุเซสชันจะถูกขับเคลื่อนโดยวัตถุอย่างต่อเนื่องก่อนที่จะส่งไปยังฐานข้อมูล
หากมีการอัปเดตหลายครั้งพยายามที่จะชะลอการอัปเดตให้นานที่สุดเท่าที่จะเป็นไปได้เพื่อลดจำนวนการอัปเดตคำสั่ง SQL ที่ออกให้ หากคุณปิดเซสชันวัตถุที่แคชทั้งหมดจะหายไปไม่ว่าจะถาวรหรืออัปเดตในฐานข้อมูล
แคชระดับ 2:
แคชระดับ 2 เป็นตัวเลือกและแคชระดับ 1 ที่จะค้นหาก่อนที่จะพยายามค้นหาแคชระดับ 2 ของวัตถุ แคชระดับที่สองสามารถกำหนดค่าได้ตามระดับและต่อหมวดหมู่ส่วนใหญ่รับผิดชอบในการแคชวัตถุในเซสชัน
แคชของบุคคลที่สามใด ๆ สามารถใช้ไฮเบอร์เนตได้ อินเทอร์เฟซ org.hibernate.cache.cacheprovider ให้และจำเป็นต้องใช้การใช้งานแคชสำหรับการจัดหาไฮเบอร์เนต
แคชระดับสอบถาม:
ไฮเบอร์เนตยังใช้การรวมตัวของชุดสืบค้นชุดและแคชระดับ 2 อย่างแน่นหนา
นี่เป็นคุณสมบัติเสริมที่ต้องใช้แคชทางกายภาพเพิ่มเติมสองตัวเพื่อบันทึกผลลัพธ์การสืบค้นแคชและภูมิภาคเมื่อตารางได้รับการอัปเดตล่าสุด สิ่งนี้มีประโยชน์มากสำหรับการสืบค้นที่มักจะทำงานด้วยพารามิเตอร์เดียวกัน
แคชระดับ 2:
Hibernate ใช้แคชระดับ 1 โดยค่าเริ่มต้นคุณไม่ได้ทำอะไรกับแคชระดับ 1 ไปตรงไปที่แคชระดับสองเสริม ไม่ใช่ทุกคลาสที่ได้รับประโยชน์จากการแคชดังนั้นจึงเป็นสิ่งสำคัญที่จะปิดการใช้งานแคชระดับ 2
แคชระดับไฮเบอร์เนตระดับ 2 ถูกตั้งค่าเป็นสองขั้นตอน ก่อนอื่นคุณต้องตัดสินใจว่าจะใช้กลยุทธ์การพร้อมกันใด หลังจากนี้คุณสามารถกำหนดค่าการหมดอายุของแคชและใช้แคชเพื่อให้แอตทริบิวต์แคชทางกายภาพ
กลยุทธ์พร้อมกัน:
นโยบายพร้อมกันเป็นสื่อกลางที่รับผิดชอบในการจัดเก็บรายการข้อมูลในแคชและดึงพวกเขาออกจากแคช หากคุณต้องการเปิดใช้งานการแคชระดับ 2 คุณจะต้องตัดสินใจว่าจะใช้นโยบายพร้อมกันของแคชใดสำหรับแต่ละคลาสและการรวบรวมแบบถาวร
การทำธุรกรรม: การใช้กลยุทธ์นี้เพื่ออ่านข้อมูลเป็นหลักเพื่อป้องกันการทำธุรกรรมพร้อมกันของข้อมูลที่ล้าสมัยเป็นสิ่งสำคัญในกรณีการอัปเดตที่หายาก
Read-Write: ใช้กลยุทธ์นี้อีกครั้งการอ่านข้อมูลหลักมีความสำคัญอย่างยิ่งต่อการป้องกันการทำธุรกรรมพร้อมกันจากข้อมูลเก่าในกรณีที่หายากของการอัปเดต
Nonstrict-Read-Write: กลยุทธ์นี้ไม่รับประกันความสอดคล้องระหว่างแคชและฐานข้อมูล ด้วยกลยุทธ์นี้คีย์คือไม่ให้ความสนใจหากข้อมูลไม่ค่อยมีการเปลี่ยนแปลงและความเป็นไปได้ของข้อมูลเก่าจะต้องค้าง
อ่านอย่างเดียว: นโยบายพร้อมกันเหมาะสำหรับข้อมูลและจะไม่เปลี่ยนแปลง ข้อมูลที่ใช้สำหรับการอ้างอิงเท่านั้น
หากเราต้องการใช้แคชระดับที่สองเป็นคลาสพนักงานของเราเรามาเพิ่มองค์ประกอบการแมปที่จำเป็นในการบอกให้ Hibernate ใช้นโยบายแคชที่อ่านได้และสามารถเขียนได้สำหรับอินสแตนซ์ของพนักงาน
<? XML เวอร์ชัน = "1.0" การเข้ารหัส = "UTF-8"?> <! Doctype Hibernate-Mapping สาธารณะ "-// hibernate/hibernate mapping dtd // en" "http://www.hibernate.org/dtd/hibernate-mapping-3 table = "พนักงาน"> <meta attribute = "Class-Description"> คลาสนี้มีรายละเอียดของพนักงาน </meta> <cache usage = "read-write"/> <id name = "id" type = "int" คอลัมน์ = "id"> <generator/> </id> <property name = "firstName" คอลัมน์ = "first_name" type = "String"/> <property name = "LastName" </class> </hibernate-mapping>
คุณสมบัติการใช้งาน = "Read-Write" บอกให้ Hibernate ใช้แคชที่กำหนดโดยนโยบายการทำงานพร้อมกันของการอ่าน-เขียน
ผู้ให้บริการแคช:
หลังจากพิจารณานโยบายพร้อมกันของคลาสผู้สมัครแคชของคุณขั้นตอนต่อไปคือการเลือกผู้ให้บริการแคช กองกำลังไฮเบอร์เนตเลือกแคชเพื่อให้บริการแอปพลิเคชันทั้งหมด
แคชที่ให้ไว้ในไฟล์กำหนดค่า hibernate.cfg.xml ที่ระบุ เลือก Ehcache เป็นผู้ให้บริการแคชระดับที่สอง:
<? XML เวอร์ชัน = "1.0" การเข้ารหัส = "UTF-8"?> <! Doctype Hibernate-Configuration System "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> org.hibernate.dialect.mysqldialect </คุณสมบัติ> <property name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </คุณสมบัติ> <! name = "hibernate.connection.username"> root </property> <property name = "hibernate.connection.password"> root123 </คุณสมบัติ> <property name = "hibernate.cache.provider_class"> org.hibernate.cache.ehcacheprovider Resource = "Employee.hbm.xml"/> </session-factory> <//hibernate-configuration>
ตอนนี้คุณต้องระบุคุณสมบัติของพื้นที่แคช Ehcache มีไฟล์การกำหนดค่าของตัวเอง ehcache.xml ในแอปพลิเคชันใน classpath ใน ehcache.xml การกำหนดค่าแคชคลาสพนักงานอาจมีลักษณะเช่นนี้:
<diskstore path = "java.io.tmpdir"/> <defaultCacheMaxElementsInMemory = "1000" Eternal = "false" timetoidleseconds = "120" timetoLiveseconds = "120" overflowTodisk = "true"/> <cache name = "Employee" MaxElementsInMemory = "500" Eternal = "true" timetoidleseconds = "0" timetoliveseconds = "0" overflowTodisk = "false"/>
ตอนนี้เปิดใช้งานแคชทุติยภูมิของชั้นเรียนของพนักงานและไฮเบอร์เนตตอนนี้มีแคชรองเมื่อใดก็ตามที่เรียกดูพนักงานหรือเมื่อพนักงานถูกโหลดโดยตัวระบุ
คุณควรวิเคราะห์คลาสทั้งหมดของคุณและเลือกกลยุทธ์การแคชที่เหมาะสมสำหรับแต่ละชั้นเรียน บางครั้งแคชรองอาจลดประสิทธิภาพของแอปพลิเคชัน ดังนั้นจึงแนะนำให้ใช้กับแอปพลิเคชันมาตรฐานที่ไม่เปิดใช้งานการแคชเป็นครั้งแรกซึ่งเหมาะสำหรับการแคชและตรวจสอบประสิทธิภาพ หากแคชไม่ปรับปรุงประสิทธิภาพของระบบมันไม่มีความหมายที่จะสร้างแคชทุกประเภท
แคชระดับสอบถาม:
การใช้แคชแบบสอบถามจะต้องเปิดใช้งานก่อนใน hibernate.cache.use_query_cache = ไฟล์การกำหนดค่าคุณสมบัติ "จริง" หากคุณสมบัตินี้ถูกตั้งค่าเป็น TRUE ให้ Hibernate สร้างแคชที่ต้องการในหน่วยความจำเพื่อบันทึกชุดคิวรีและตัวระบุ
ถัดไปการใช้แคชแบบสอบถามคุณสามารถใช้วิธี setCacheable (บูลีน) ของคลาสการสืบค้น ตัวอย่างเช่น:
Hibernate ยังรองรับการสนับสนุนแคชที่ละเอียดมากผ่านแนวคิดของพื้นที่แคช แคชเป็นส่วนหนึ่งของแคชที่ได้รับชื่อ
รหัสนี้ใช้วิธีการบอก Hibernate เพื่อจัดเก็บและค้นหาคำถามเกี่ยวกับพนักงานในแคช