ITエンジニアぽむのブログ

IT系で気になったことを書き留めておく備忘録です。仕事でよく使っているJavaと自宅で使っているLinuxについて書いていこうと思っています。同じお悩みをお持ちの方のお役に立てたら嬉しいです。

自動生成したEntityをコンソール上に表示してみよう!

まえがき

自動生成したEntityを使って、テーブルの内容をコンソール上に表示するプログラムをご紹介したいと思います。

Hibernateツールをインストールし、Entityを自動生成する方法については下記リンクを参考にして下さいね。

pom2019.hatenablog.com

Hibernate4.3とMySQLを使ってデータを表示する、自動生成したEntityを使用しない方法については下記リンクを参考にして下さいね。

pom2019.hatenablog.com

開発環境

開発環境は下記の通りです。

Hibernate4.3.0.Final
MySQL8.0.16

hibernate.cfg.xmlの変更

hibernate.cfg.xmlに今回使用するEntityをマッピングします。

※20行目と21行目が今回追加したソースコードです。

※パスワードはマスキングしています。

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/TESTDB?useUnicode=true&amp;characterEncoding=UTF-8</property>
        <property name="connection.username">test</property>
        <property name="connection.password">****</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

        <!-- Disable the second-level cache -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        
        <!-- Mapping file inclusion -->
        <mapping class="com.pom2019.entity.HouseholdAppliances"/>

    </session-factory>
</hibernate-configuration>

Entityクラスの変更

toStringメソッドをオーバーライドして、指定した文字列をコンソールに表示させます。

※追加コメントが今回追加したソースコードです。

package com.pom2019.entity;
// Generated 2019/07/13 21:16:35 by Hibernate Tools 4.3.5.Final

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * HouseholdAppliances generated by hbm2java
 */
@Entity
@Table(name = "HouseholdAppliances", catalog = "TESTDB")
public class HouseholdAppliances implements java.io.Serializable {

    private static final long serialVersionUID = 3713670612166968592L;
    private Integer id;
    private String householdAppliancesName;
    private Date purchaseDate;

    public HouseholdAppliances() {
    }

    public HouseholdAppliances(String householdAppliancesName, Date purchaseDate) {
        this.householdAppliancesName = householdAppliancesName;
        this.purchaseDate = purchaseDate;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)

    @Column(name = "id", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name = "HouseholdAppliancesName", length = 100)
    public String getHouseholdAppliancesName() {
        return this.householdAppliancesName;
    }

    public void setHouseholdAppliancesName(String householdAppliancesName) {
        this.householdAppliancesName = householdAppliancesName;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "PurchaseDate", length = 10)
    public Date getPurchaseDate() {
        return this.purchaseDate;
    }

    public void setPurchaseDate(Date purchaseDate) {
        this.purchaseDate = purchaseDate;
    }

    /**
    * !!!追加!!!
    */
    @Override
    public String toString() {
        return "id:"+id+"\thouseholdAppliancesName:"+householdAppliancesName+"\tpurchaseDate:"+purchaseDate;
    }
}

メインメソッドの変更

最後にメインメソッドを変更して、HQLで取得したEntityをコンソール上に表示します。

package com.pom2019;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

import com.pom2019.entity.HouseholdAppliances;

public class App {

    public static void main(String[] args) {
        // configures settings from hibernate.cfg.xml
        Configuration configuration = new Configuration().configure();
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties());
        SessionFactory sf = configuration.buildSessionFactory(builder.build());

        Session ss = sf.openSession();
        @SuppressWarnings("unchecked")
        List<HouseholdAppliances> result = ss.createQuery("FROM HouseholdAppliances").list();
        for (HouseholdAppliances r : result) {
            System.out.println(r);
        }

        if (sf != null) {
            sf.close();
        }
    }
}

出力結果

AppクラスをJavaアプリケーションで実行します。

7 20, 2019 9:18:19 午後 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
7 20, 2019 9:18:19 午後 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.0.Final}
7 20, 2019 9:18:19 午後 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
7 20, 2019 9:18:19 午後 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
7 20, 2019 9:18:19 午後 org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml
7 20, 2019 9:18:19 午後 org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml
7 20, 2019 9:18:19 午後 org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
7 20, 2019 9:18:19 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000402: Using Hibernate built-in connection pool (not for production use!)
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
7 20, 2019 9:18:19 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://127.0.0.1:3306/TESTDB?useUnicode=true&characterEncoding=UTF-8]
7 20, 2019 9:18:19 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=test, password=****}
7 20, 2019 9:18:19 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
7 20, 2019 9:18:19 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 1 (min=1)
7 20, 2019 9:18:19 午後 org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
7 20, 2019 9:18:20 午後 org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
7 20, 2019 9:18:20 午後 org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select householda0_.id as id1_0_, householda0_.HouseholdAppliancesName as Househol2_0_, householda0_.PurchaseDate as Purchase3_0_ from TESTDB.HouseholdAppliances householda0_
id:1    householdAppliancesName:冷蔵庫   purchaseDate:2008-12-01
id:2    householdAppliancesName:電子レンジ purchaseDate:2015-08-01
id:3    householdAppliancesName:オーブントースター purchaseDate:2015-08-01
id:4    householdAppliancesName:クーラー    purchaseDate:2011-06-01
id:5    householdAppliancesName:洗濯機   purchaseDate:2012-04-01

あとがき

無事、自動生成したEntityをコンソール上に表示することができました。

自動生成したEntityを使うことで、ソースの見通しが良くなって保守性が上がるし、テーブル名やカラム名を直書きしないといけないSQLよりもクラス名やフィールド名を使ったHQLを使う方がテーブルの内容の変更にも柔軟に対応できて開発しやすいと思います。

O/Rマッパーを初めて使ったときの感動が忘れられない!

最後までお読み頂きありがとうございました。