הייברנייט גט מול לואד

ב-Hibernate, קיים הרעיון של השלכת שורה בודדת. כדי להשיג שורה בודדת בטבלה המתאימה במסד הנתונים, נשתמש באחת מהשיטות הבאות:get() או load().

get()

get() תמיד מגיע למסד הנתונים.

אם מזהה סידורי נמצא, אזי נקבל את הפרטים המתאימים.

דוגמה

SwingBowlers swingBowlers = (SwingBowlers) openSession.get(SwingBowlers.class,1);

מזהה סידורי הוא 1 (jerSeyNo) –> מפתח ראשי

אם ה-ID הסדרה ייבא לא נמצא, אז נקבל את התוצאה כ-null.load()

load() תמיד יוצר אובייקט פרוקסי. אם ה-ID הסדרה נמצא, אז נקבל את הפרטים המתאימים.

דוגמה

SwingBowlers swingBowlers = (SwingBowlers) openSession.get(SwingBowlers.class,1);

System.out.println(swingBowlers);

ה-ID הסדרה הוא 1 (jerSeyNo) –> מפתח ראשי

אם ה-ID הסדיר לא נמצא , אז נקבל תוצאה של org.hibernate.ObjectNotFoundException.  

בדוק האם זה עדיין מייצר שאילתא, למרות שאנו משתמשים בשיטת הטעינה מכיוון שאנו מנסים להדפיס פרטים על האובייקט. [System.out.println(swingBowlers);]. אך זה מגיע רק מאובייקט הפרוסי [אובייקט דומי].

בואו נבחן זאת בפועל.

HibernateTutorialRun.java

Java

 

package com.blogspot.javacodebypj;

import com.blogspot.javacodebypj.dao.SwingBowlersDaoImpl;

public class HibernateTutorialRun {

    public static void main(String[] args) {

        SwingBowlersDaoImpl sbdi = new SwingBowlersDaoImpl();

        sbdi.getSwingBowlers();

        }

}

הסבר: HibernateTutorialRun היא מחלקה להפעלת היישום HibernateTutorial, ואנו משתמשים בה ללא שרת. Hibernate יכול לרוץ עם שרת וללא שרת. יצרנו את השיטה הראשית, ובתוכה פשוט יצרנו עצם למחלקה המתאימה SwingBowlersDaoImpl. לאחר מכן אנו פשוט משתמשים באובייקט התיוג של האובייקט כדי לקרוא לשיטה המתאימה.

SwingBowlersDao.java

Java

 

package com.blogspot.javacodebypj.dao;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import com.blogspot.javacodebypj.domain.SwingBowlers;

import com.blogspot.javacodebypj.util.HibernateUtil;



public class SwingBowlersDaoImpl implements SwingBowlersDao {

    @Override

    public void getSwingBowlers() {

        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

        Session openSession = sessionFactory.openSession();

       // באמצעות שיטת הטעינה

        SwingBowlers swingBowlers = (SwingBowlers) openSession.load(SwingBowlers.class, 1);

        System.out.println(swingBowlers);

    }

}

הסבר: בדיוק יצרנו SwingBowlersDaoImpl מחלקה ויישמנו אותה עם SwingBowlersDao ואנו עומדים לשנות את השיטה המתאימה. אנו מנסים לקרוא לHibernateUtil שיטת המחלקה, כלומר, getSessionFactory שיטה, נקבל SessionFactory אובייקט, ועם הSessionFactory אצל בסיס הקריאה openSession שיטה. לאחר מכן נקבל Session אובייקט. 

לאחר שנשיג אובייקט של סשן עם הסשן הזה, נוכל להשתמש ב שיטת load או שיטת get, ואנו פשוט ממירים למחלקה המתאימה בגלל שיטת load או שיטת get מחזירה אובייקט. אני מקווה שאתה מכיר את הרעיון של upcasting ו-downcasting ב Java.

SwingBowlers.java

Java

 

package com.blogspot.javacodebypj.domain;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Id;

@Entity

public class SwingBowlers {

    @Id

    @Column(length = 3)

    private int jerseyNo;

    @Column(length = 15)

    private String bowlerName;

    @Column(length = 10)

    private String country;

    public int getJerseyNo() {

        return jerseyNo;

    }

    public void setJerseyNo(int jerseyNo) {

        this.jerseyNo = jerseyNo;

    }

    public String getBowlerName() {

        return bowlerName;

    }

    public void setBowlerName(String bowlerName) {

        this.bowlerName = bowlerName;

    }

    public String getCountry() {

        return country;

    }

    public void setCountry(String country) {

        this.country = country;

    }

    @Override

    public String toString() {

        return "SwingBowlers [jerseyNo=" + jerseyNo + ", bowlerName=" + bowlerName + ", country=" + country + "]";

    }

}

הסבר: מכיוון שאנו ממפים שדות לעמודות במסד הנתונים. אם זה אותו שם שדה כמו העמודה בטבלת המסד הנתונים, אז אין צורך לכתוב את ערך שם העמודה ברמת ההערות. כך גם שם הטבלה הוא זהה לשם המחלקה SwingBowlersלכן אנו לא מסומנים עם @Table. כדי להפוך אותו למחלקת תחום, אנו משתמשים בהסמנית @Entity בראש המחלקה המתאימה.

HibernateUtil.java

Java

 

package com.blogspot.javacodebypj.util;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static SessionFactory sessionFactory;

    private HibernateUtil() {

    }

    public static SessionFactory getSessionFactory() {

        if (sessionFactory == null) {

            Configuration conf = new Configuration().configure();

            sessionFactory = conf.buildSessionFactory();

        }

        return sessionFactory;

    }

}

הסבר: בדיוק נוצרנו SessionFactory כמחלקה סינגלטון. 

hibernate.cfg.xml

Java

 

<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">



<hibernate-configuration>

    <session-factory>

        <property name="connection.driver_class">com.mysql.jdbc.Driver

        </property>

        <property name="connection.url">jdbc:mysql://localhost:3306/cricketer</property>

        <property name="connection.username">root</property>

        <property name="connection.password">myRoot4*</property>



        <property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>

        <property name="show_sql">true</property>

        <property name="hbm2ddl.auto">update</property>



        <mapping class="com.blogspot.javacodebypj.domain.SwingBowlers" />



    </session-factory>

</hibernate-configuration>

הסבר: בזה, יש לנו שלושה סעיפים: 

  1. מאפיינים קשורים למסד נתונים
  2. מאפיינים קשורים לHibernate
  3. מחלקת המיפוי

כפי שאתה יודע, אנו לא משתמשים בקובץ XML מיפוי של Hibernate, ולכן הזכרנו רק את מחלקת המיפוי.

ניב: זה משמש ליצירת שאילתות בהתאם למסד הנתונים. ביישום זה, אנו משתמשים במסד הנתונים של MySQL.

show_sql: ברגע שאנו יוצרים שאילתות, אנו צריכים לראות את השאילתות אלו, ולכן עלינו לציין אותן כאמת.

pom.xml

Java

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.blogspot.javacodebypj</groupId>

    <artifactId>HibernateTutorial</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <name>HibernateTutorial</name>

    <description>HibernateTutorial by Ponnam Jay</description>

    <properties>

        <maven.compiler.target>1.8</maven.compiler.target>

        <maven.compiler.source>1.8</maven.compiler.source>

    </properties>

    <dependencies>

        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->

        <dependency>

            <groupId>org.hibernate</groupId>

            <artifactId>hibernate-core</artifactId>

            <version>5.6.14.Final</version>



        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

            <version>8.0.28</version>

        </dependency>



    </dependencies>

</project>

הסבר:פיתחנו מבנה פרויקט Maven זה באמצעות סביבת הפיתוח Eclipse IDE כפרויקט Maven פשוט. הוספנו את ההסמנים של hibernate-core, mysql-connector-java והשתמשנו ב-Java 1.8 כדי לראות ב-pom.xml בסעיף המאפיינים יעד ומקור.

פרטים על מסד הנתונים


מסקנה

אם אתה רוצה להשיג (לשחזר) שורה אחת (רשומה אחת), אז אפשר להשתמש בשיטה get [או] load שיטה.

Source:
https://dzone.com/articles/hibernate-get-vs-load