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が発生します

ロードメソッドを使用しているにも関わらず、オブジェクトの詳細を表示しようとしているため、クエリが生成されているかどうかを確認してください。[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オブジェクトを取得します。

セッションオブジェクトを取得したら、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>

解説:このMavenプロジェクト構造はEclipse IDEを使用してシンプルなMavenプロジェクトとして生成しました。依存関係としてhibernate-coremysql-connector-javaを追加し、pom.xmlのプロパティセクションでターゲットとソースを観察するためにJava 1.8を使用しました。

データベースの詳細


結論

もし単一の行(単一のレコード)を取得(取得)したい場合は、getメソッドまたはloadメソッドを使用できます。

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