JavaRush /Java Blog /Random-JA /Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート...
Макс
レベル 41

Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 3)

Random-JA グループに公開済み
こんにちは。この記事では、単純な CRUD アプリケーションを作成する過程で、Maven、Spring、Hibernate、MySQL、Tomcat などに初めて遭遇したことを共有したいと思います。これは 4 の 3 番目の部分です。この記事は主に、ここですでに 30 ~ 40 のレベルを完了しているが、まだ純粋な Java を超えて冒険をしていなく、オープンワールドに参入し始めたばかり (またはこれから始めようとしている) 人を対象としています。これらすべてのテクノロジー、フレームワーク、その他の聞きなれない言葉。 Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 3) - 1これは記事「Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの紹介」の第 3 部です。以前の部分は、次のリンクからご覧いただけます。

コンテンツ:

データベースの作成と接続

さて、データベースの作業を始めるときが来ました。Hibernateに接続し、そこですべてがどのように機能するかを考える前に、まずデータベース自体を見てみましょう。作って、つなげて、作って、サインを埋めてみましょう。DBMS (データベース管理システム) MySQLを使用します(もちろん、最初にダウンロードしてインストールする必要があります)。 SQL (構造化照会言語) は、リレーショナル データベース内のデータを作成、変更、操作するために使用される宣言型プログラミング言語です。このようなデータベースでは、データはテーブルの形式で保存されます。アプリケーションはどのようにデータベースと通信しますか (SQL クエリをデータベースに送信し、結果を返します)。このため、Java には JDBC (Java DataBase Connectivity)などがあります。これは、簡単に言えば、データベースを操作するためのインターフェイスとクラスのセットです。データベースと対話するには、接続を作成する必要があります。このために、パッケージにはjava.sqlクラス がありますConnection。接続を確立するにはいくつかの方法があります。たとえば、getConnectionクラスメソッドを使用できますDriverManager。ただし、データベースは多数あり、それぞれ異なるため、データベースとの対話は直接実行されません。したがって、それぞれに独自の JDBC ドライバーがあり、このドライバーを使用してデータベースへの接続が確立されます。そこで、後々気を取られないよう、まずはMySQLドライバーをインストールしましょう。次の依存関係を追加しましょうpom.xml
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>
それではデータベースを作成しましょう。 [表示] -> [ツール ウィンドウ] -> [データベース] - データベース パネルが開きます。 新しい (緑の +) -> データ ソース -> MySQL - ユーザー名とパスワードを指定する必要があるウィンドウが開きます。これらは MySQL のインストール時に設定します (たとえば、root と root を使用しました)。ポート (MySQL 3306 のデフォルト)、名前など。そのままにしておきます。「接続テスト」ボタンを使用して接続をテストできます。 「OK」Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 3) - 2をクリックすると、MySQL サーバーに接続されます。次に、データベースを作成しましょう。これを行うには、開いたコンソールでスクリプトを作成できます。
CREATE DATABASE test
「実行」 をクリックするとデータベースの準備が整い、接続できるようになります。これを行うには、「データ ソースのプロパティ」に戻り、「データベース」フィールドにデータベース名 (テスト) を入力し、ユーザー名とパスワードを再度入力して「OK」をクリックします。次に、テーブルを作成する必要があります。グラフィカル ツールを使用することもできますが、初めての場合は、手動でスクリプトを作成して、それがどのようになるかを確認する価値があります。
USE test;

CREATE TABLE films
(
  id int(10) PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(100) NOT NULL,
  year int(4),
  genre VARCHAR(20),
  watched BIT DEFAULT false  NOT NULL
)
COLLATE='utf8_general_ci';
CREATE UNIQUE INDEX films_title_uindex ON films (title);

INSERT INTO `films` (`title`,`year`,`genre`, watched)
VALUES
  ("Inception", 2010, "sci-fi", 1),
  ("The Lord of the Rings: The Fellowship of the Ring", 2001, "fantasy", 1),
  ("Tag", 2018, "comedy", 0),
  ("Gunfight at the O.K. Corral", 1957, "western", 0),
  ("Die Hard", 1988, "action", 1);
films列などを含む 名前でテーブルが作成されますidtitle各列のタイプが示されます (括弧内は最大出力サイズ)。
  • PRIMARY KEY- これは主キーであり、テーブル内のレコードを一意に識別するために使用されます (一意性を意味します)。
  • AUTO_INCREMENT— 値は自動的に生成されます (もちろんゼロ以外の値になるため、これを指定する必要はありません)
  • NOT NULL- ここでもすべてが明らかであり、空であることはできません
  • DEFAULT— デフォルト値を設定します
  • COLLATE- エンコーディング
  • CREATE UNIQUE INDEX— フィールドをユニークなものにする
  • INSERT INTO— テーブルにレコードを追加します
結果は次のようなサインになります。 おそらく、今のところ、Web アプリケーションとは別に接続してみる価値はあるでしょう。これに問題が発生した場合は、すぐに解決します。それ以外の場合は、後でHibernateに接続し、何かを実行し、設定し、いじくり回して、どこかで失敗したとしても、少なくとも問題はここにあるわけではないことがわかります。さて、接続を確認するために、一時的にメソッドを作成しましょうmain。原則として、コントローラー クラス内であっても、モデルや構成内であっても、どこにでも配置できます。それは問題ではありません。接続に問題がないことを確認するために使用するだけでよく、削除しても構いません。ただし、より注意するために、別のクラスを作成しましょうMain
package testgroup.filmography;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/test";
        String username = "root";
        String password = "root";
        System.out.println("Connecting...");

        try (Connection connection = DriverManager.getConnection(url, username, password)) {
            System.out.println("Connection successful!");
        } catch (SQLException e) {
            System.out.println("Connection failed!");
            e.printStackTrace();
        }
    }
}
ここではすべてが簡単です。データベースに接続パラメータを設定し、接続を作成してみます。これを起動しmainて見てみましょう。そのため、例外、タイムゾーンの問題、および SSL に関するその他の警告が発生しました。インターネットを閲覧すると、これはかなり一般的な問題であり、異なるバージョンのドライバー (mysql-connector-java) を使用すると、異なる結果が生じる可能性があることがわかります。たとえば、バージョン 5.1.47 を使用している場合、タイムゾーンによる例外はなく、接続は正常に作成されますが、SSL 警告が依然としてポップアップ表示されることが実験的にわかりました。他のバージョンでは、単なる警告ではなく、SSL に関して例外があるようでした。さて、それは重要ではありません。この問題に個別に対処することもできますが、ここでは説明しません。これに対する解決策はすべて非常に簡単です。問題がタイムゾーンにある場合と、問題が SSL にある場合は 、 urlに追加のパラメータを指定する必要があります。serverTimezoneuseSSL
String url = "jdbc:mysql://localhost:3306/test?serverTimezone=Europe/Minsk&useSSL=false";
これでタイムゾーンを設定し、SSL を無効にしました。もう一度起動するmainと、接続が成功しました。なるほど、接続を確立する方法がわかりました。クラスはMain基本的にそのタスクを完了したため、削除できます。

ORMとJPA

良い意味で、理解を深めるためには、休止状態などを使わずに、最初から順番にデータベースに慣れていくのが良いでしょう。したがって、いくつかのガイドを見つけて、まず JDBC クラスを操作したり、SQL クエリを手動で作成したりしてみることをお勧めします。さて、すぐにORMモデルに移りましょう。これはどういう意味ですか?もちろん、これについては個別に読むことをお勧めしますが、簡単に説明してみます。ORM (オブジェクト リレーショナル マッピングまたはオブジェクト リレーショナル マッピング) は、オブジェクトをリレーショナル データベース構造にマッピングするためのテクノロジです。Java オブジェクトをテーブル行として表現します。ORM のおかげで、SQL スクリプトの作成について心配する必要がなく、オブジェクトの操作に集中できます。それの使い方。Java には、ORM 概念を実装する JPA (Java Persistence API) というもう 1 つの優れた機能があります。JPA はそのような仕様であり、オブジェクトの要件を記述し、データベースを操作するためのさまざまなインターフェイスと注釈を定義します。JPA は本質的には説明であり、標準です。したがって、多くの具体的な実装があり、その 1 つ (そして最も人気のある実装の 1 つ) が Hibernate であり、これがこのフレームワークの本質です。Hibernate は、オブジェクト リレーショナル マッピング (ORM) の問題を解決するために設計された JPA 仕様の実装です。このすべてをプロジェクトに結び付ける必要があります。さらに、Spring が傍観者にならず、データベースを使用したこのすべての動きにも参加できるようにするには、さらにいくつかのモジュールを接続する必要があります。spring-webmvc の依存関係から得たものすべてでは、これには十分ではなくなりました。データベースと連携するにはspring-jdbc 、トランザクションをサポートするにはspring-tx、 Hibernate と連携するにはspring-ormも必要です。に依存関係を追加しましょうpom.xml:
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>5.1.1.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.3.7.Final</version>
</dependency>
これら 2 つの依存関係で十分です。hibernate-corejavax.persistence-apiとともに到着し、spring-jdbcおよびspring-txとともにspring-orm が到着します。

実在物

したがって、クラスオブジェクトをFilmデータベースに保存できるようにしたいと考えています。これを行うには、クラスがいくつかの条件を満たす必要があります。JPA には、このためのEntityのようなものがあります。エンティティ クラスは、プライベート フィールドとそのゲッターとセッターを備えた通常のPOJOクラスです。パラメーターのない非プライベート コンストラクター (またはデフォルト コンストラクター) が必要であり、主キーが必要です。データベース内のこのクラスの各レコードを一意に識別するもの。このようなクラスのすべての要件については、個別に読むこともできます。FilmJPA アノテーションを使用してクラスをエンティティに しましょう。
package testgroup.filmography.model;

import javax.persistence.*;

@Entity
@Table(name = "films")
public class Film {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "title")
    private String title;

    @Column(name = "year")
    private int year;

    @Column(name = "genre")
    private String genre;

    @Column(name = "watched")
    private boolean watched;

    // + getters and setters
}
  • @Entity- このクラスがエンティティであることを示します。
  • @Table- このエンティティを表示する特定のテーブルを指します。
  • @Id— このフィールドが主キーであることを示します。このプロパティは、それぞれの一意のエントリを識別するために使用されます。
  • @Column- フィールドをテーブルの列に接続します。フィールド名とテーブルの列名が同じ場合は省略できます。
  • @GeneratedValue— プロパティは自動的に生成されます。括弧内でその方法を指定できます。さまざまな戦略がどのように機能するのかを正確に理解することはできません。この場合、新しい値がそれぞれ前の値から 1 ずつ増加することを知っていれば十分です。
プロパティごとに、他にも多くのことを指定できます。たとえば、何をゼロ以外にするか、一意にするか、デフォルト値や最大サイズを指定するなどです。これは、このクラスに基づいてテーブルを生成する必要がある場合に役立ちます。Hibernate にはこのオプションがあります。ただし、すでにテーブルを自分たちで作成し、すべてのプロパティを設定しているため、テーブルなしでも問題ありません。 ちょっとしたメモ。Hibernate のドキュメントでは、フィールドではなくゲッターでアノテーションを使用することを推奨しています。ただし、これらのアプローチの違いは非常に微妙であり、この単純なアプリケーションではこれは何の効果もありません。さらに、ほとんどの人はとにかくフィールドの上に注釈を置きます。したがって、このままにしておきます。見た目がすっきりします。

休止状態のプロパティ

さて、休止状態の設定を始めましょう。まず最初に、ユーザー名とパスワード、URL などの情報を別のファイルに入れましょう。もちろん、接続をチェックしたときと同様に、それらをクラス内で通常の行として直接指定することもできます (String username = "root";その後、接続を作成するメソッドに渡します)。ただし、そのような静的データを何らかのファイルに保存する方がより正確ですproperty。また、たとえばデータベースを変更する必要がある場合、すべてのクラスを調べてデータベースが使用されている場所を探す必要はなく、このファイルの値を 1 回変更するだけで十分です。リソースディレクトリにdb.propertiesファイルを作成しましょう。
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?serverTimezone=Europe/Minsk&useSSL=false
jdbc.username=root
jdbc.password=root

hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
hibernate.show_sql=true
さて、データベースに接続するためのパラメータ、つまり上記からすべてが明らかです。ドライバーのクラス名、URL、ユーザー名、およびパスワード。 hibernate.dialect- このプロパティは、どの特定のバージョンの SQL 言語が使用されているかを Hibernate に示すために必要です。実際のところ、どの DBMS でも、機能を拡張したり、機能を追加したり、何かを最適化したりするために、通常は言語をわずかに最新化します。その結果、各 DBMS には独自の SQL 言語があることがわかりました。英語と同じように、同じ言語のように思えますが、オーストラリア、アメリカ、イギリスでは少し異なり、単語によっては意味が異なる場合があります。また、理解に関する問題を回避するには、Hibernate が何を処理する必要があるかを Hibernate に直接伝える必要があります。 hibernate.show_sql— このプロパティのおかげで、データベースへのクエリがコンソールに表示されます。これは必須ではありませんが、これを使用すると、少なくとも何が起こっているかを見ることができます。そうでないと、Hibernate がある種の魔法を実行しているように見える可能性があります。もちろん、表示するのが完全に明確になるわけではありません。これには何らかのロガーを使用する方が良いですが、それはまた別の機会に、今のところはこれで十分です。

休止状態の構成

構成の設定に進みましょう。パッケージ内にconfigクラスを作成しましょうHibernateConfig
package testgroup.filmography.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@ComponentScan(basePackages = " testgroup.filmography")
@EnableTransactionManagement
@PropertySource(value = "classpath:db.properties")
public class HibernateConfig {
    private Environment environment;

    @Autowired
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
        properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
        return properties;
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
        dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
        dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
        dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
        return dataSource;
    }

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan("testgroup.filmography.model");
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());
        return transactionManager;
    }
}
ここには新しいものがかなりたくさんあるので、さらに各項目に関する情報をさまざまなソースで探すことをお勧めします。ここで簡単に説明してみましょう。
  • 私たちは授業をしたときに@Configurationすでに理解していました。@ComponentScanWebConfig
  • @EnableTransactionManagement— トランザクションの管理に使用できるようになりますTransactionManager。Hibernate はトランザクションを使用してデータベースと連携します。トランザクションは、特定の操作セットを 1 つの全体として実行するために必要です。メソッドのいずれかの操作に問題がある場合、他の操作はすべて実行されません。そのため、古典的な送金の例のように、1 つの口座からお金を引き出す操作が完了したときのようなことは起こりませんが、別の人に書き込む操作は機能せず、その結果、お金が消えてしまいました。
  • @PropertySource— 最近作成したプロパティ ファイルを接続します。
  • Environmentproperty-ファイルからプロパティを取得するため。
  • hibernateProperties- このメソッドは、Hibernate プロパティを Properties オブジェクトとして表すために必要です
  • DataSource— データベースへの接続を作成するために使用されます。これは、以前に を作成したときに使用したDriverManagerの代替品ですmain。ドキュメントには、DataSource使用することが望ましいと記載されています。もちろん、違いや利点が何であるかをインターネットで読むことを忘れずに、それを行うつもりです。特に利点の 1 つは、データベース接続プール (DBCP) を作成できることです。
  • sessionFactory— エンティティ オブジェクトの操作を実行するセッションを作成します。ここでは、データ ソース、Hibernate プロパティ、およびエンティティ クラスを検索する必要があるパッケージを設定します。
  • transactionManager— トランザクション マネージャーを構成します。
についての小さなメモDataSource。ドキュメントには、標準実装、つまり の使用DriverManagerDataSourceは推奨されないと記載されています。これは通常の接続プーリングの代替にすぎず、通常はテストなどにのみ適しています。通常のアプリケーションの場合は、何らかの DBCP ライブラリを使用することをお勧めします。もちろん、私たちのアプリケーションには、今あるもので十分ですが、全体像を完成させるために、アドバイスどおりに別の実装を使用することになるかもしれません。次の依存関係を追加しましょうpom.xml
<dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-dbcp</artifactId>
            <version>9.0.10</version>
</dependency>
そして、dataSourceクラスメソッドでは、それをパッケージのメソッドにHibernateConfig置き換えます。 DriverManagerDataSourceBasicDataSourceorg.apache.tomcat.dbcp.dbcp2
BasicDataSource dataSource = new BasicDataSource();
さて、すべての準備ができているようです。設定の準備ができています。残っているのは、それをAppInitializerに追加することだけです。
protected Class<?>[] getRootConfigClasses() {
        return new Class[]{HibernateConfig.class};
    }

データアクセス層

いよいよ DAO を始めるときが来ました。私たちはクラスに行きFilmDAOImpl、まずそこからトライアルリストを削除します。もう必要ありません。セッションファクトリーを追加して作業してみましょう。
private SessionFactory sessionFactory;

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
まず、映画のリストを含むページを表示するメソッドを作成します。その中でセッションを受け取り、データベースにリクエストを行います (すべてのレコードを取り出してリストを作成します)。
public List<Film> allFilms() {
        Session session = sessionFactory.getCurrentSession();
        return session.createQuery("from Film").list();
    }
ここでポイントは2つあります。まず、警告が表示されました。これは、パラメータ化された を受け取りたいがList<Film>Listコンパイル時にリクエストがどのような型を返すかが不明なため、メソッドが返されるだけであるという事実によるものです。したがって、このアイデアは、安全でない変換を行っているため、問題が発生する可能性があることを警告します。このような疑問が生じないようにするための正しい方法がさらにいくつかあります。インターネット上の情報を検索できます。しかし、今は気にしないようにしましょう。実際のところ、どの型が返されるのかは正確にわかっているため、ここで問題は発生せず、警告を無視してかまいません。ただし、目が目障りにならないように、メソッドの上に注釈を付けることができます@SupressWarning("unchecked")。これを行うことで、コンパイラーに「心配してくれてありがとう」と伝えているようなものですが、私は自分が何をしているのかを知っており、すべてを制御しているので、このメソッドについて心配する必要はなく、リラックスできます。次に、アイデアには赤い下線「from Film」が付けられています。これは単なる HQL (Hibernate Query Language) クエリであり、このアイデアではすべてが正しいのか、エラーがあるのか​​がわかりません。アイデアの設定に移動して、すべてを手動で調整できます (興味があればインターネットで調べてください)。または、単純に Hibernate フレームワークのサポートを追加することもできます。これを行うには、プロジェクトを右クリックし、 [フレームワーク サポートの追加]を選択し、 Hibernateのチェックボックスをオンにして [OK] をクリックします。この後、おそらくエンティティ クラス ( Film) 内の多くの項目にも赤の下線が引かれます。たとえば、注釈によって「テーブル 'films' を解決できません」@Table(name = "films")という警告が発行されます。繰り返しますが、ここには何も問題はなく、これは設計エラーではなく、すべてがコンパイルされて機能します。この考えが強調されるのは、それが私たちの基地について何も知らないからです。これを修正するには、アイデアをデータベースと統合しましょう。[表示] -> [ツール ウィンドウ] -> [永続化] (タブが開きます) ->マウスの右ボタンで [データ ソースの割り当て] -> [データ ソース] を選択し、データベースへの接続を指定して[ OK] をクリックします。 これらすべてが解決されても、まだ何かが残っています。より高いレベル、サービスに行きましょう。クラスでは、Spring メソッドをアノテーションでマークします。これは、メソッドがトランザクションで実行される必要があることを示します (これがないと、Hibernate は動作を拒否します)。 Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 3) - 3FilmServiceImplallFilms@Transactional
@Transactional
public List<Film> allFilms() {
    return filmDAO.allFilms();
}
これですべての準備が完了したので、コントローラーの何も触れる必要はありません。さて、正念場が来たようです。「実行」をクリックして何が起こるか見てみましょう。 Maven、Spring、MySQL、Hibernate、および最初の CRUD アプリケーションの概要 (パート 3) - 4そして、これが私たちのサインです。今回は、それは私たちが授業中に直接作成したリストからではなく、データベースから取得されました。素晴らしい、すべてがうまくいっているようだ。ここで、セッション メソッドを使用して、他のすべての CRUD 操作を同じ方法で実行します。結果のクラスは次のようになります。
package testgroup.filmography.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import testgroup.filmography.model.Film;

import java.util.List;

@Repository
public class FilmDAOImpl implements FilmDAO {
    private SessionFactory sessionFactory;

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Film> allFilms() {
        Session session = sessionFactory.getCurrentSession();
        return session.createQuery("from Film").list();
    }

    @Override
    public void add(Film film) {
        Session session = sessionFactory.getCurrentSession();
        session.persist(film);
    }

    @Override
    public void delete(Film film) {
        Session session = sessionFactory.getCurrentSession();
        session.delete(film);
    }

    @Override
    public void edit(Film film) {
        Session session = sessionFactory.getCurrentSession();
        session.update(film);
    }

    @Override
    public Film getById(int id) {
        Session session = sessionFactory.getCurrentSession();
        return session.get(Film.class, id);
    }
}
あとは、忘れずにサービスにアクセスしてメソッドにアノテーションを追加するだけです@Transactional。以上です、準備完了です。これで実行して確認できるようになりました。リンクやボタンをクリックして、エントリの追加/削除/編集を試してください。すべてが正しく行われていれば、機能するはずです。これは Hibernate、Spring、MySQL を使用した本格的な CRUD アプリケーションです。続く... Maven、Spring、MySQL、Hibernate および最初の CRUD アプリケーションの紹介 (パート 1) Maven、Spring、MySQL、Hibernate および最初の CRUD アプリケーションの紹介 (パート 2) Maven、Spring、MySQL、Hibernate および最初の CRUD アプリケーション (パート 3) Maven、Spring、MySQL、Hibernate および最初の CRUD アプリケーションの概要 (パート 4)
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION