Hibernate 中的 Get 與 Load 比較

在Hibernate中,存在單行提取的概念。為了從相應的資料庫表中獲取單一行,我們會選擇使用get()load()

get()

get()總是直接訪問資料庫。

如果找到序列化ID,則我們將獲得相應的詳細信息。

示例

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

序列化ID為1(jerSeyNo)–>主鍵

若可序列化ID 未找到,則返回結果為null。load()

load() 始終創建一個代理對象。 若可序列化ID存在,則返回相應詳情。

示例

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

System.out.println(swingBowlers);

可序列化ID為1(jerSeyNo)–>主鍵

若找不到可序列化的ID,則會得到一個結果:org.hibernateObjectNotFoundException異常

檢查是否仍會生成查詢,即使我們使用的是load方法,因為我們正嘗試打印對象詳情[如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();

       // 使用load方法

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

        System.out.println(swingBowlers);

    }

}

解釋:我們剛創建了SwingBowlersDaoImpl類並將其實現為SwingBowlersDao,並將覆蓋相應的方法。我們正嘗試調用HibernateUtil類的方法,即getSessionFactory方法,我們將獲得SessionFactory對象,並通過SessionFactory對象引用,調用openSession方法。接著,我們將獲得Session對象。

一旦我們透過此會話獲取了Session對象,我們可以選擇使用load方法或是get方法,並且我們只需將其轉型為對應的類別,這是因為load方法或get方法返回的是Object。希望您了解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. 映射類別

如您所知,我們並未使用Hibernate映射XML文件,因此僅提及映射類別

方言:用於根據資料庫生成查詢。本應用中,我們使用MySQL資料庫。

show_sql:生成查詢後,我們需要查看這些查詢,因此需將其設為true。

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>

解釋:我們剛透過Eclipse IDE生成了這個Maven專案結構,作為一個簡單的Maven專案。我們添加了如hibernate-coremysql-connector-java等依賴,並使用Java 1.8,這些都可以在pom.xml的屬性部分中看到目標和來源。

資料庫詳情


結論

如果你想提取(檢索)單一行(單一記錄),那麼你可以使用get方法[或]load方法。

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