Object-Relational Mapping
Problem : OO Class & RDBMS
OO World RDBMS World
?
Hibernate: Introduction
Gavin King
Hibernate ถกสรางขนโดยนกพฒนาจากประเทศออสเตรเลย Gavin King
ทตองการแกไขปญหาการทางานระหวางโปรแกรมเชงวตถและฐานขอมล
เชงสมพนธจนเปนทมาของ Hibernate ซอฟตแวรแบบรหสเปดทใชงาน
ในปจจบน
Hibernate เปนเครองมอทไมมคาใชจายท
ใชในการโปรแกรมดวยภาษาจาวาเพอ
บนทก อพเดท หรอลบขอมลออกจาก
ระบบฐานขอมลเชงสมพนธได
พฒนาขนตงแตปลายป 2001
Problem Solved : Hibernate
Object Relational Mapping
เปนโปรแกรมทใชแปลงออบเจกตจากโปรแกรมภาษาหนง ๆ ใหอยในรป
ของตารางหรอเอนตทในระบบฐานขอมลเชงสมพนธ
ทาหนาทเปนสะพานเชอมระหวางออบเจกตและตารางฐานขอมล
โดยคลาสจะถกแปลงใหอยในรปของตาราง
สวนออบเจกตเองจะถกอางถงขอมลแถวภายในตารางในฐานขอมล
ในขณะทแอททรบวตจะถกอางถงขอมลคอลมน
Available solutions
ORM frameworks ทมอยในทองตลาดปจจบน
Language Name Type
Java Hibernate Open-Source
Java IBATISASF
(Apache Software Foundation)
Java Top-Link Oracle
.NET NHibernate Open-source
.NET Genome commercial
Hibernate: Introduction
แนวคดหลกของ Hibernate คอ : โปรแกรมเมอรสรางคลาสแบบ
POJOs [Plain Old Java Objects] ดวยจาวาแลว ทาไมตองใชภาษาท
สอง SQL สาหรบการทางานรวมกบฐานขอมลดวย ?
Hibernate ทาหนาทเปนออบเจกตแบบ Persistence ทสามารถทางาน
รวมกบฐานขอมลเชงสมพนธไดโดยตรง รวมทงสามารถใชควรได
นนหมายความวา Hibernate บนทกออบเจกตลงในฐานขอมล และ
อานขอมลในรปออบเจกตออกจากฐานขอมลเชงสมพนธได
Hibernate จงเปนสงทตอบสนองตอความตองการของจาวา
โปรแกรมเมอร
Persistence
หมายถงการบนทกขอมลแบบถาวรเพอใหสามารถนาไปใชไดในภายหลง
Persistence แบบทไดการยอมรบมากทสดไดแก ฐานขอมลเชงสมพนธ
(Relational Database)
จาวาแอพพลเคชนสามารถเชอมตอกบระบบฐานขอมลเชงสมพนธ ผาน
JDBC โดยมการทางานรวมกบภาษาสอบถามขอมล SQL
Problem with Persistence
Identity และ Equality
จาวาใชเมธอด equals() และเครองหมาย == เพอสนบสนนการทางาน
แบบ Equality และ Identity ตามลาดบ
ตวอยางเชน การใชเครองหมาย == เพอตรวจสอบวาทงสองออบเจกตม
การอางองไปยงตาแหนงแอดเดรสภายในหนวยความจาเดยวกนหรอไม
เมธอด equals() ถกใชในการเปรยบเทยบขอมลของทงสองออบเจกตม
คาเทากนหรอไม
ในจาวาระหวาง Identity และ Equality มความแตกตางกนอยางชดเจน แต
ในฐานขอมลเชงสมพนธจะไมมอะไรทเกยวของกบนยามดงกลาวแมแต
นอย
Problem with Persistence (cont)
วธการแกไขความไมสอดคลองกนทาไดโดยการเพมแอททรบวตพเศษลง
ภายในจาวาคลาส เพอใชเปนคอลมนพเศษทเรยกวา Identifier หรอคยหลก
ทอยในตารางฐานขอมล
Pure Java Driver
JavaApplication DB Client
JDBC API JDBC Driver
Data Source
Server
STEP 1: Register JDBC driverSTEP 2: Open a connectionSTEP 3: Execute a querySTEP 4: Extract data from result setSTEP 5: Clean-up environment
2/1/2019
Steps : Java with JDBC
//STEP 1: Register JDBC driverClass.forName("com.mysql.jdbc.Driver");
//STEP 2: Open a connectionconn = DriverManager.getConnection("jdbc:mysql://localhost:3306/student",”root”,”1234”);
//STEP 3: Execute a querystmt = conn.createStatement();String sql = "SELECT * FROM Table’s name";ResultSet rs = stmt.executeQuery(sql);
//STEP 4: Extract data from result setwhile(rs.next()){
//Retrieve by column name//Display values
}
//STEP 5: Clean-up environmentrs.close();stmt.close();conn.close();
Hibernate และ JDBC
JDBC เมอเปดการเชอมตอกบเซรฟเวอรฐานขอมล ตองปดหลงการใชงาน
เสมอ อาจสงผลใหเกดปญหาเกยวกบจานวนการใชงานทเกนกาหนดได
การแกปญหาดงกลาวอาจจาเปนตองใชกลไกทเรยกวา Connection Pool ซง
เปนกลไกภายในการทางานหลกของ Hibernate อยแลว
ในแอพลเคชนแบบเรยลไทมการสรางตารางพรอมกบคยหลกดวย JDBC
จาเปนตองเขยนโคดเปนจานวนมากในการทางานในลกษณะดงกลาว แต
ใน Hibernate สามารถจดการไดโดยงาย
ใน JDBC จาเปนตองเขยนโคดเพมเพอใชในการจดการ Transactions แตใน
Hibernate สามารถใชโคดภายในจดการ Transaction โดยตรง
ADV : Hibernate
Open Source เปนซอฟตแวรแบบรหสเปดทไมมคาใชจายในการใชงาน
Fast performance เนองจากใชกลไกทเรยกวา แคช (Cache)
Database Independent query ใชการควรขอมลผานกลไกทเรยกวา HQL
Automatic Table Creation ใน Hibernate ไดจดเตรยมกลไกในการสราง
ตารางฐานขอมลแบบอตโนมต
Simplifies complex join มคณสมบตทชวยลดความซบซอนของการ join
ระหวางตารางตาง ๆ ภายในฐานขอมล
Provides Query Statistics และ Database Status มการจดเตรยมขอมลทาง
สถตไวสาหรบการควรและแสดงสถานะของฐานขอมลได
Hibernate Architecture
Hibernate มการทางานทมลกษณะเปนลาดบชนทอยระหวางแอพพลเคชน
และฐานขอมล
การเชอมตอระหวางคลาสในรปของ Persistence ออบเจกตไปยงฐานขอมล
โดยอาศยการทางานรวมกบคณสมบตตาง ๆ ของ Hibernate รวมไปถง
ขอมลทกาหนดไวในรปของ XML ไฟลตาง ๆ ดงรปการทางานตอไปน
Hibernate Architecture
การทางานของ Hibernate เรมตนดงรปตอไปน
Hibernate Core’s
สวนประกอบหลกในการทางานของ Hibernate
SessionFactory
เปน interface ทใชในการสราง session ออบเจกตเพอสงตอไปยง
Hibernate แอพพลเคชน
SessionFactory (cont.)
Session มลกษณะเปน heavy weighted ออบเจกต ดงนนจงถกออกมาให
ใช SessionFactory สรางขนเพยงออบเจกตเดยวโดยใชรปแบบของ
Singleton แพตเทรน
การเรยกใช Session Factory ออบเจกตสามารถทาไดดงคาสงตอไปน
Configuration configuration=new Configuration();configuration.configure();
ServiceRegistry sr = ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
SessionFactory session = configuration.buildSessionFactory(sr);
Session
เปน single-threaded มชวงชวตสน ๆ เพอทางานรวมกบโปรแกรมและ
การจดการ persistence
หอหมการทางานของ JDBC connection ไวภายใน
Persistent Objects and Collections
เปนออบเจกตจากคลาส POJO แตมความพเศษอยตรงทเกยวของกบ
Session ออบเจกตหนง ๆ
สนสดสถานะภาพ Persistent ออบเจกตเมอ Session ถกปดการทางาน
Transient Objects and Collections
เปนออบเจกตของจาวาคลาสปกตทเกดขนจากคาสง new ไมมความ
เกยวของใด ๆ กบ Session
ยงไมเกยวของใด ๆ กบฐานขอมลเชงสมพนธ
Transaction
Hibernate สราง transaction ผาน session interface
หากตองการใหฐานขอมลทางาน ตองสตารท transaction และเมอเสรจ
งานแลวตองปด transaction เพอสนสดการทางานกบฐานขอมล
Hibernate Transaction Management
Transaction เปนเพยงการนาเสนอในรป unit ของงาน
ดงนนเมอขนตอนหนง fails ใน transaction ทงหมดจะ fails ตามไปดวย
การใชงานเมธอดหลกของ Transaction ใน Hibernate หลก ๆ ไดแก
commit(), rollback()
การทางานรวมกบ Hibernate transaction
Configuration configuration = new Configuration().configure();StandardServiceRegistryBuilder builder = new
StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build());
Session session = sessionFactory.openSession();
try {session.beginTransaction();
session.getTransaction().commit();}catch (HibernateException e) {
e.printStackTrace();session.getTransaction().rollback();
}session.close();sessionFactory.close()
Hibernate Programming
การโปรแกรมดวยจาวารวมกบ Hibernate เพอแปลงคลาสใหเปน
ฐานขอมลสามารถทาไดสองวธไดแก
การโปรแกรมโดยใชไฟล XML
การโปรแกรมโดยใชสญลกษณ Annotation
Steps to create first Hibernate
การโปรแกรมดวย Hibernate มขนตอนดงตอไปน :
สราง Persistent คลาส
สรางไฟล XML สาหรบการ mapping จาก Persistent คลาส
สรางไฟล XML สาหรบการตงคาโครงแบบ (Configuration)
สรางออบเจกตสาหรบการบนทกหรอการอานคา persistent ออบ
เจกต
สราง Schema ของฐานขอมลเพอรองรบการทางานไวกอน
รนคลาสสาหรบการทดสอบการทางานของโปรแกรม
Create the Persistent class
Persistent คลาสตองเปนไปตามเกณฑดงตอไปน :
A no-arg constructor: ใชคอนสตรคเตอรแบบ default เทานน
Provide an identifier property (optional): เพอใชในคอลมนทเปนคย
หลกของฐานขอมล
Declare getter and setter methods (optional): สรางเมธอดเฉพาะ
ประเภท getter และ setter เทานน โดยใชชอทเปน default
Prefer non-final class: Hibernate ใชแนวคดในการทางานแบบ
proxies ทการประกาศไมควรเปน final
Hibernate & XML
ขนตอนการสรางจาวาคลาสpackage com.itsci.hibernate;public class Student {
private int studentId;private String studentName;
public int getStudentId() {return studentId;
}public void setStudentId(int studentId) {
this.studentId = studentId;}public String getStudentName() {
return studentName;}public void setStudentName(String studentName) {
this.studentName = studentName;}
}
Mapping ไฟลสาหรบจาวาออบเจกต
การแปลงคลาสออบเจกตใหอยในรปแถวขอมลภายในตารางฐานขอมลดวย
Hibernate จาเปนตองใหรายละเอยดขอมลตาง ๆ ทจาเปนสาหรบการทางาน
ซงขอมลดงกลาวจะถกบนทกไวในไฟลชอ student.hbm.xml
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping> <class name="com.itsci.hibernate.Student" table="student">
<id name="studentId"> <generator class="increment"></generator> </id>
<property name="studentName"></property> </class> </hibernate-mapping>
Hibernate Mapping ไฟล
<id> ใชเปนคาคยหลก (ID) เพอชวยปองกนความซ าซอนของขอมล
name – ชอของ id
column – ชอคอลมนในฐานขอมลสาหรบ id
<generator> ใชสราง id ทไมซ ากนทกครงทมการเรยกใชการทางาน
increment – แตละครงจะสราง id ใหมทเลอกจากคาสงสดในตาราง
ฐานขอมลและเพมไปอกหนงคาถดไป
<property> ทก ๆ แอททรบวตของจาวาคลาสทตองการแปลงใหเปน
ตารางฐานขอมลจาเปนตองกาหนด tags นไวในแตละคา ไดแก
name ระบชอของ property โดยอกษรตวแรกตองเปนตวเลกเสมอ
column ระบชอคอลมนในฐานขอมลทตองการบนทกคาจะแอททร
บวตนน ๆ
Configuration : Hibernate
ในการแปลงจาวาคลาสใหเปนตารางฐานขอมลดวย Hibernate จาเปนตองใช
ขอมลทจาเปนทถกจดเกบไวในไฟลทเรยกวา hibernate.cfg.xml
<property name="connection.driver_class">: ใชสาหรบระบคลาส
JDBC driver
<property name="hibernate.connection.url "> : ใชสาหรบระบหมายเลข
พอรตและชอตารางฐานขอมลของ JDBC ทตองการเรยกใช
<property name="hibernate.connection.username " > : ใชระบ username
ของฐานขอมล
<property name="hibernate.connection.password" >: ใชระบ password
ของฐานขอมล
การตงคาโครงแบบใน Hibernate
<property name="hibernate.connection.pool_size">: เปนคณสมบตทใช
จากดจานวนการหยดรอการเชอมตอกบฐานขอมลใน Hibernate
<property name="show_sql">: สงผลใหมการรนการทางานของ
Hibernate จะแสดงผลทก ๆ คาสง SQL ทเรยกใชภายในคอนโซลเสมอ
<property name="hbm2ddl.auto">: ใชระบการทางานทเกดขนภายใน
ระบบฐานขอมล เชน create, update หรอ drop ฐานขอมล เปนตน
<mapping class="com.itsci.himernate.student">: เปนการระบตาแหนง
ของจาวาคลาสพรอมแพคเกจตามลาดบ
hibernate.cfg.xml
<hibernate-configuration><session-factory>
<!-- Database connection settings --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql://localhost:3306/student</property><property name="connection.username">root</property><property name="connection.password">1234</property>
<!-- Echo all executed SQL to stdout --><property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup --><property name="hbm2ddl.auto">create</property>
<!-- Mention here all the model classes along with their package name --><mapping resource="student.hbm.xml"/>
</session-factory></hibernate-configuration>
Run
public static void main(String[] args) {Configuration configuration = new Configuration().configure();StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());SessionFactory sessionFactory =
configuration.buildSessionFactory(builder.build());
Session session = sessionFactory.openSession();Transaction tx = null;Student student1 = new Student(); student1.setStudentName("Somchai");Student student2 = new Student(); student2.setStudentName("Somsri");
tx = session.beginTransaction();session.save(student1);session.save(student2);tx.commit();session.close();
sessionFactory.close();}
}
save Persistent Object
การ insert จะสมบรณเมอ
tx.commit();
Hibernate with Annotations
ในยคแรก Hibernate ใชวธการแปลงคลาสใหเปนตารางฐานขอมลได
ตองผาน hbm.xml ไฟลเทานน
หากมความซบซอนมากขนจะสงผลใหขอมลภายในไฟลดงกลาวทม
จานวนมากขนดวย นอกจากนนยงเกดผลเสยอน ๆ ทตามมาดงตอไปน
ขอมลเกยวกบจาวาคลาสจะตองถกดาเนนการจากไฟลทอยภายนอก
ในกรณทมการทางานรวมกบจาวาคลาสจานวนมากขนขอ มลภายใน
ไฟล XML จะมขนาดใหญขนตามไปดวย สงผลใหจดการไดยาก
ขอผดพลาดทเกดขนในไฟล XML จะสงผลกระทบโดยตรงตอ
โปรแกรมทถกพฒนาขน
ดงนนจงไดพฒนาวธการทางานแบบใหมโดยใชสญลกษณทเรยกวา
Annotation มาใชในการโปรแกรม
Hibernate Annotation
ผใช Hibernate สามารถเลอกใชการทางานผานสญลกษณ Annotation
หรอใชงานรวมกบไฟล .hbm.xml กได
ตวอยางการใช Annotation พนฐานสาหรบการโปรแกรมรวมกบ
Hibernate สาหรบตวอยางบางสวนของโปรแกรมมดงตอไปน
@Entitypublic class Sample {
@Id@GeneratedValue(strategy = GenerationType.IDENTITY)public Integer id;public String name;
}
Hibernate Annotation
Annotation ประกอบดวยสญลกษณ @ ตามดวยชอของ Annotation ท
ตองการเพอประยกตใชกบการทางานในระดบของเมธอดหรอคลาส
Annotation พนฐานทถกกาหนดไวใน Hibernate และมกพบบอย ๆใน
การใชงานมดงตอไปน
@Entity
ใชระบ ไวกอนหนาคลาสใหอยในรปของเอนตททตองการแปลงให
เปนตารางในฐานขอมล ในบางกรณหากผใชตองการเปลยนชอเอน
ตทสามารถทาไดดงตวอยางคาสงตอไปน
@Entity(name="Entity_name")
Hibernate Annotation
@Table
โดยปกตแลว Hibernate สรางตารางโดยใชชอเดยวกบคลาส แตการ
ใช @Table ยอมใหผใชสามารถระบชอของตารางไดตามตองการ
@Table(name="Table_name")
@Id
แตละเอนตทจาเปนตองมคยหลก ซงสามารถกาหนดผาน @Id ดงน
@Idprivate Long studentId;
Hibernate Annotation
@Id ทใชในการระบคยหลกมกใชรวมกบ @GeneratedValue เพอสราง
คาคยหลกโดยอตโนมต
@GeneratedValue รบคาพารามเตอรสองชนดไดแก strategy และ
generator สาหรบ strategy ใชสาหรบกาหนดชนดของการเพมคาโดยม
รปแบบและรายละเอยดในการทางานดงตอไปน(strategy=GenerationType.AUTO) (strategy=GenerationType.IDENTITY) (strategy=GenerationType.SEQUENCE) (strategy=GenerationType.TABLE)
ในกรณทไมมการระบ strategy ไว Hibernate จะใชคา Default ไดแก
GenerationType.AUTO แทนทเสมอ
Import package needs
org.hibernate.annotations.Table: ใชรวมกบ annotation เพอแปลงใหอยใน
รปตาราง
javax.persistence.Column: ใชสาหรบการแปลงเอนตทฟลดรวมกบ
คอลมนในตาราง
javax.persistence.Entity: ใชสาหรบระบจาวาคลาสปกตใหอยในรปเอนต
ทคลาส
javax.persistence.GeneratedValue: ใชในการสรางคาสาหรบคยหลก
javax.persistence.Id: ใชสาหรบกาหนดคยหลกของเอนตท
javax.persistence.Table: ใชสาหรบการแปลงใหเปนตารางฐานขอมล
Annotation Example
@Entity@Table (name="STUDENT")public class Student {
@Id @GeneratedValueprivate int studentId;private String studentName;
public int getStudentId() { return studentId; }public void setStudentId(int studentId) {
this.studentId = studentId;}public String getStudentName() { return studentName; }public void setStudentName(String studentName) {
this.studentName = studentName;}public String toString() {
return "Student ID: "+this.studentId + " Student Name: "+this.studentName;}
}
Simple Mappings (Annotations)
public class Student {
int studentId;
String studentName;
}
STUDENTstudentID studentNAME
@Entity
@Id
4
hibernate.cfg.xml
<hibernate-configuration><session-factory>
<!-- Database connection settings --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql://localhost:3306/student</property><property name="connection.username">root</property><property name="connection.password">1234</property>
<!-- Echo all executed SQL to stdout --><property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup --><property name="hbm2ddl.auto">create</property>
<!-- Mention here all the model classes along with their package name --><mapping class="com.itsci.hibernate.Student"/>
</session-factory></hibernate-configuration>
แกไขเปนชอคลาส
ทตองการ mappaing
Hibernate Connection
public class HibernateConnection {
static String url = "jdbc:mysql://localhost:3306/StudentDB?characterEncoding=UTF-8";static String uname = "root";static String pwd = "1234";
public static SessionFactory sessionFactory;
public static SessionFactory doHibernateConnection() {Properties database = new Properties();database.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");database.setProperty("hibernate.connection.username", uname);database.setProperty("hibernate.connection.password", pwd);database.setProperty("hibernate.connection.url", url);database.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");Configuration cfg = new Configuration().setProperties(database).addPackage("bean")
.addAnnotatedClass(Student.class);StandardServiceRegistryBuilder ssrb =
new StandardServiceRegistryBuilder().applySettings(cfg.getProperties());sessionFactory = cfg.buildSessionFactory(ssrb.build());return sessionFactory;
}
}
กรณท 2 สามารถเขยนเปนคลาส แทนการสราง hibernate.cfg.xml ไดดงน
Run Program
Session session = sessionFactory.openSession();Transaction tx = null;Student student1 = new Student();student1.setStudentName("Somchai");Student student2 = new Student();student2.setStudentName("Somsri");try{
tx = session.beginTransaction();session.save(student1);session.save(student2);tx.commit();
}catch (HibernateException e) {if (tx!=null) tx.rollback();e.printStackTrace();
}finally {session.close();
}sessionFactory.close();
}
Output
Hibernate: select max(studentId) from studentHibernate: insert into student (studentName, studentId) values (?, ?)Hibernate: insert into student (studentName, studentId) values (?, ?)
‘select max(studentID) from student’?Hibernate first finding out the highest number and then it uses that value for the insert. All just by saying “Save”.
Read Object : session.get()
เมธอด get() ทางานโดยการผานคาสง SQL ไปยงฐานขอมลเพออาน
ขอมลจากตารางทเกยวของและสรางผลลพธในรปออบเจกตเมธอด get()
รบคาชอของเอนตทและคาคยหลกทตองการ
session.save(student1);session.save(student2);tx.commit();
Student dbStudent1 = (Student) session.get(Student.class, 1);System.out.println("Valid Student get called");System.out.println(dbStudent1);
Student dbStudent2 = (Student) session.get(Student.class, 20);System.out.println("Invalid Student get called");System.out.println(dbStudent2);
Output : session.get()
Hibernate: insert into STUDENT (studentName) values (?)Hibernate: insert into STUDENT (studentName) values (?)Student1 saved with ID: 1Student2 saved with ID: 2Valid Student get calledStudent ID: 1 Student Name: SomchaiHibernate: select student0_.studentId as studentI1_0_0_, student0_.studentName as studentN2_0_0_ from STUDENT student0_ where student0_.studentId=?Invalid Student get calledNull
Get ID from session.save()
int id1 = (Integer) session.save(student1);nt id2 = (Integer) session.save(student2);
session.getTransaction().commit();Student dbStudent1 = (Student) session.get(Student.class, id1);System.out.println(“Student ID “ + dbStudent1.getStudentID +
“Student Name : “+ dbStudent1.getStudentName());
Student dbStudent2 = (Student) session.get(Student.class, id2);System.out.println(“Student ID “ + dbStudent2.getStudentID +
“Student Name : “+ dbStudent2.getStudentName());
Hibernate: insert into STUDENT (studentName) values (?)Hibernate: insert into STUDENT (studentName) values (?)
Student ID: 1 Student Name: Somchai
Student ID: 2 Student Name: Somsri
Read Object : session.load()
เมธอด session.load()
การอานคาโดยอาศยคยหลกนอกจากจะใชโดยการอานคาจากฐานขอ มล
โดยตรงแลวยงสามารถใชในการอานขอมลจากกลไกทเรยกวาแคช (Cache)
ซงมวตถประสงคในการลดจานวนครงในการเขาถงฐานขอมลโดยตรงสงผล
ใหโปรแกรมทางานไดเรวขน
session.save(student1);session.save(student2);tx.commit();
Student dbStudent1 = (Student) session.load(Student.class, 1);System.out.println("Valid Student get called");System.out.println(dbStudent1);Student dbStudent2 = (Student) session.load(Student.class, 20);System.out.println("Invalid Student get called");System.out.println(dbStudent2);
Output : session.load()
Hibernate: insert into STUDENT (studentName) values (?)Hibernate: insert into STUDENT (studentName) values (?)Student1 saved with ID: 1Student2 saved with ID: 2Valid Student load calledStudent ID: 1 Student Name: SomchaiInvalid Student load calledHibernate: select student0_.studentId as studentI1_0_0_, student0_.studentName as studentN2_0_0_ from STUDENT student0_ where student0_.studentId=?org.hibernate.ObjectNotFoundException:
session.get() vs session.load()
student1 = (Student) session.get(Student.class, 1);System.out.println("Student get called");System.out.println(student1.getClass().getName());System.out.println(student1);student2 = (Student) session.load(Student.class, 2);System.out.println("Student load called");System.out.println(student2.getClass().getName());System.out.println(student2);
Hibernate: select student0_.studentId as studentI1_0_0_, student0_.studentName as studentN2_0_0_ from STUDENT student0_ where student0_.studentId=?com.itsci.hibernate.StudentStudent ID: 1 Student Name: Somchaicom.itsci.hibernate.Student_$$_jvstde_0Hibernate: select student0_.studentId as studentI1_0_0_, student0_.studentName as studentN2_0_0_ from STUDENT student0_ where student0_.studentId=?Student ID: 2 Student Name: Somsri
เมธอด get() คนคา
ชอคลาส Student
เมธอด load() คนคาชอ
คลาส Student_$$_jvstde_0