عصر بخیر. در این مقاله میخواهم اولین برخورد خود را با مواردی مانند Maven، Spring، Hibernate، MySQL و Tomcat در فرآیند ایجاد یک برنامه ساده CRUD به اشتراک بگذارم. این قسمت سوم از 4 است. این مقاله در درجه اول برای کسانی در نظر گرفته شده است که قبلاً 30-40 سطح را در اینجا تکمیل کرده اند، اما هنوز از جاوای خالص فراتر نرفته اند و تازه شروع کرده اند (یا در شرف شروع) برای ورود به دنیای باز با همه این فن آوری ها، چارچوب ها و دیگر کلمات ناآشنا. این قسمت سوم مقاله «معرفی Maven، Spring، MySQL، Hibernate و اولین برنامه CRUD» است. قسمت های قبلی را می توانید از طریق لینک های زیر مشاهده کنید:
- مقدمه ای بر Maven، Spring، MySQL، Hibernate و اولین برنامه CRUD (قسمت 1)
- مقدمه ای بر Maven، Spring، MySQL، Hibernate و اولین برنامه CRUD (قسمت 2)
محتوا:
- ایجاد و اتصال پایگاه داده
- ORM و JPA
- وجود، موجودیت
- Hibernate Properties
- تنظیمات Hibernate
- لایه دسترسی به داده
ایجاد و اتصال پایگاه داده
خوب، زمان شروع کار بر روی پایگاه داده است. قبل از اتصال Hibernate و فکر کردن در مورد نحوه کارکرد آن در آنجا، ابتدا اجازه دهید به خود پایگاه داده نگاهی بیندازیم. بیایید آن را ایجاد کنیم، وصل کنیم، آن را بسازیم و علامت را پر کنیم. ما از DBMS (سیستم مدیریت پایگاه داده) MySQL استفاده خواهیم کرد (البته ابتدا باید دانلود و نصب کنید). SQL (زبان پرس و جوی ساختاریافته) یک زبان برنامه نویسی اعلامی است که برای ایجاد، اصلاح و دستکاری داده ها در پایگاه داده رابطه ای استفاده می شود. در این گونه پایگاه داده ها داده ها در قالب جداول ذخیره می شوند. چگونه برنامه با پایگاه داده ارتباط برقرار می کند (انتقال پرس و جوهای SQL به پایگاه داده و برگرداندن نتایج). برای این کار، جاوا چیزی به نام JDBC (اتصال پایگاه داده جاوا) دارد که به زبان ساده مجموعه ای از رابط ها و کلاس ها برای کار با پایگاه های داده است. برای تعامل با پایگاه داده، باید یک اتصال ایجاد کنید؛ برای این، بستهjava.sql
دارای یک کلاس است Connection
. راه های مختلفی برای ایجاد یک اتصال وجود دارد، به عنوان مثال می توانید از متد getConnection
کلاس استفاده کنید DriverManager
. با این حال، تعامل با پایگاه داده به طور مستقیم انجام نمی شود، زیرا پایگاه های داده بسیاری وجود دارد و آنها متفاوت هستند. بنابراین برای هر یک از آنها JDBC Driver مخصوص به خود وجود دارد با استفاده از این درایور، اتصال به پایگاه داده برقرار می شود. بنابراین، اول از همه، برای اینکه بعداً حواسمان به این موضوع پرت نشود، بیایید درایور MySQL را نصب کنیم . بیایید pom.xml
وابستگی زیر را اضافه کنیم:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
حالا بیایید پایگاه داده را ایجاد کنیم. نمایش -> ابزار ویندوز -> پایگاه داده - پانل پایگاه داده باز می شود. جدید (سبز +) -> منبع داده -> MySQL - پنجره ای باز می شود که در آن باید نام کاربری و رمز عبور را مشخص کنید، ما آنها را هنگام نصب MySQL تنظیم می کنیم (مثلاً من از root و root استفاده کردم). پورت (پیشفرض برای MySQL 3306)، نام و غیره. آن را همانطور که هست رها کن می توانید اتصال را با استفاده از دکمه " Test Connection " آزمایش کنید. روی OK کلیک کنید و اکنون به سرور MySQL متصل هستیم. بعد، بیایید یک پایگاه داده ایجاد کنیم. برای انجام این کار، می توانید یک اسکریپت در کنسولی که باز می شود بنویسید:
CREATE DATABASE test
روی Execute کلیک کنید و دیتابیس آماده است، حالا می توانید آن را متصل کنید، برای این کار به Data Source Properties برگردید و در قسمت 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
با ستون ها id
و title
غیره ایجاد می شود. برای هر ستون، نوع مشخص شده است (حداکثر اندازه خروجی در پرانتز).
PRIMARY KEY
- این کلید اصلی است که برای شناسایی منحصر به فرد یک رکورد در جدول استفاده می شود (که دلالت بر منحصر به فرد بودن دارد)AUTO_INCREMENT
- مقدار به طور خودکار تولید می شود (البته غیر صفر خواهد بود، بنابراین لازم نیست این را مشخص کنید)NOT NULL
- در اینجا همه چیز نیز واضح است، نمی تواند خالی باشدDEFAULT
- مقدار پیش فرض را تنظیم کنیدCOLLATE
- رمزگذاریCREATE UNIQUE INDEX
- زمینه را منحصر به فرد کنیدINSERT INTO
- یک رکورد به جدول اضافه کنید
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 یک استثنا وجود دارد و نه فقط یک هشدار. خوب، این موضوع نیست. می توانید سعی کنید به طور جداگانه با این موضوع برخورد کنید، اما ما اکنون به آن نمی پردازیم. راه حل این همه بسیار ساده است، شما باید پارامترهای اضافی را در url مشخص کنید ، یعنی serverTimezone
اگر مشکل مربوط به منطقه زمانی است، و useSSL
اگر مشکل از SSL است:
String url = "jdbc:mysql://localhost:3306/test?serverTimezone=Europe/Minsk&useSSL=false";
اکنون منطقه زمانی را تنظیم کرده و SSL را غیرفعال کرده ایم. ما آن را دوباره راه اندازی کردیم main
و voila - اتصال موفق شد! خوب، عالی، ما متوجه شدیم که چگونه یک اتصال ایجاد کنیم. کلاس Main
اساسا وظیفه خود را انجام داده است، می توانید آن را حذف کنید.
ORM و JPA
به بیان خوب، برای درک بهتر، بهتر است از همان ابتدا و بدون هیبرنیت و موارد دیگر، به ترتیب با پایگاه های داده آشنا شوید. بنابراین، ایده خوبی است که چند راهنما پیدا کنید و ابتدا سعی کنید با کلاس های JDBC کار کنید، پرس و جوهای SQL را به صورت دستی بنویسید و غیره. خوب، بیایید فوراً به سراغ مدل ORM برویم. این یعنی چی؟ البته باز هم توصیه می شود در این مورد جداگانه مطالعه کنید، اما سعی می کنم به اختصار آن را شرح دهم. ORM (نگاشت شی - رابطه یا نگاشت شی - رابطه ای) یک فناوری برای نگاشت اشیاء در ساختارهای پایگاه داده رابطه ای است. برای نشان دادن شی جاوا ما به عنوان یک ردیف جدول. به لطف ORM، لازم نیست نگران نوشتن اسکریپت های SQL باشید و روی کار با اشیا تمرکز کنید. نحوه استفاده از آن. جاوا یک چیز عالی دیگر، JPA (Java Persistence API) دارد که مفهوم ORM را پیاده سازی می کند. JPA چنین مشخصاتی است؛ الزامات اشیاء را توصیف می کند، رابط ها و حاشیه نویسی های مختلفی را برای کار با پایگاه داده تعریف می کند. JPA اساساً یک توصیف، یک استاندارد است. بنابراین، بسیاری از پیاده سازی های خاص وجود دارد که یکی از آنها (و یکی از محبوب ترین آنها) Hibernate است که ماهیت این فریم ورک است. Hibernate یک پیاده سازی از مشخصات JPA است که برای حل مشکلات نگاشت شی رابطه ای (ORM) طراحی شده است. ما باید کل این موضوع را به پروژه خود متصل کنیم. علاوه بر این، برای اینکه بهار ما در حاشیه قرار نگیرد و همچنین با پایگاه داده در این حرکت شرکت کند، باید چند ماژول دیگر را به هم وصل کنیم، زیرا همه چیزهایی که از وابستگی بهار-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>
همین دو وابستگی کافی است. javax.persistence-api
همراه با hibernate-core و Spring-jdbc و Spring-tx به همراه Spring-orm وارد می شود .
وجود، موجودیت
بنابراین ما می خواهیم که اشیاء کلاسFilm
بتوانند در پایگاه داده ذخیره شوند. برای انجام این کار، کلاس باید تعدادی از شرایط را برآورده کند. در JPA چیزی به نام Entity برای این وجود دارد . کلاس موجودیت یک کلاس POJO معمولی است که فیلدهای خصوصی و گیرنده و تنظیم کننده برای آنها دارد. باید سازنده غیر خصوصی بدون پارامتر (یا سازنده پیشفرض) داشته باشد و باید یک کلید اصلی داشته باشد. چیزی که به طور منحصر به فرد هر رکورد این کلاس را در پایگاه داده شناسایی می کند. شما همچنین می توانید در مورد تمام الزامات چنین کلاسی به طور جداگانه مطالعه کنید. بیایید کلاس خود را Film
با استفاده از حاشیه نویسی JPA به یک موجودیت تبدیل کنیم:
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 Properties
خب، بیایید راه اندازی Hibernate خود را شروع کنیم. و اول از همه، اجازه دهید اطلاعاتی مانند نام کاربری و رمز عبور، url و موارد دیگر را در یک فایل جداگانه قرار دهیم. البته میتوانید آنها را بهعنوان یک خط معمولی مستقیماً در کلاس مشخص کنید، همانطور که وقتی اتصال را بررسی کردیم (String username = "root";
و سپس آن را به متد ایجاد اتصال منتقل کردیم). اما درست تر است که چنین داده های ایستا را در برخی از property
فایل ها ذخیره کنید. و اگر، برای مثال، نیاز به تغییر پایگاه داده دارید، دیگر لازم نیست همه کلاسها را مرور کنید و مکان استفاده از آن را جستجو کنید، کافی است یک بار مقدار موجود در این فایل را تغییر دهید. بیایید یک فایل 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
خوب، همه چیز از بالا مشخص است، پارامترهای اتصال به پایگاه داده، یعنی. نام کلاس راننده، آدرس اینترنتی، نام کاربری و رمز عبور. hibernate.dialect
- این ویژگی برای نشان دادن نسخه خاصی از زبان SQL برای Hibernate مورد نیاز است. واقعیت این است که در هر DBMS، به منظور گسترش قابلیت ها، اضافه کردن برخی عملکردها یا بهینه سازی چیزی، معمولاً زبان را کمی مدرن می کنند. در نتیجه، معلوم می شود که هر DBMS گویش SQL مخصوص به خود را دارد. مانند انگلیسی است، به نظر می رسد که زبان یکسان است، اما در استرالیا، ایالات متحده آمریکا یا بریتانیا کمی متفاوت خواهد بود، و برخی از کلمات ممکن است معانی متفاوتی داشته باشند. و برای جلوگیری از هرگونه مشکل در درک، باید مستقیماً به Hibernate بگویید که دقیقاً با چه چیزی سر و کار دارد. hibernate.show_sql
- به لطف این ویژگی، پرس و جوهای مربوط به پایگاه داده در کنسول نمایش داده می شود. این لازم نیست، اما با این چیز می توانید حداقل به آنچه در حال رخ دادن است نگاه کنید، در غیر این صورت ممکن است به نظر برسد که Hibernate در حال انجام نوعی جادو است. خوب، البته، نمایش کاملاً واضح نخواهد بود؛ بهتر است از نوعی لاگر برای این کار استفاده کنید، اما این چیزی برای زمان دیگری است، در حال حاضر این کار را انجام می دهد.
تنظیمات 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
قبلاً@ComponentScan
متوجه شده بودیم که چه زمانی کلاس را انجام دادیمWebConfig
. @EnableTransactionManagement
- به شما امکان می دهد از آنTransactionManager
برای مدیریت تراکنش ها استفاده کنید. Hibernate با استفاده از تراکنش ها با پایگاه داده کار می کند؛ آنها برای انجام مجموعه خاصی از عملیات به عنوان یک کل واحد مورد نیاز هستند، یعنی. اگر روش با هر یک از عملیات ها مشکل داشته باشد، بقیه عملیات اجرا نمی شوند، به طوری که مانند مثال کلاسیک با انتقال پول، زمانی که عملیات برداشت پول از یک حساب کامل شد، اتفاق نمی افتد، اما عملیات نوشتن به دیگری کار نکرد، در نتیجه پول ناپدید شد.@PropertySource
- اتصال فایل خواصی که اخیراً ایجاد کردیم.Environment
- به منظور دریافت خواص ازproperty
یک فایل.hibernateProperties
- این روش برای نمایش خصوصیات Hibernate به عنوان یک شیء Properties مورد نیاز استDataSource
- برای ایجاد اتصال به پایگاه داده استفاده می شود. این جایگزینی برای DriverManager است که قبلاً هنگام ایجاد آن از آن استفاده کردیمmain
. مستندات می گوید کهDataSource
استفاده از آن ترجیح داده می شود. این کاری است که ما انجام خواهیم داد، البته فراموش نکنیم که در اینترنت بخوانید تفاوت و مزایا. یکی از مزایای خاص این است که توانایی ایجاد یک پایگاه ارتباطی پایگاه داده (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
جایگزین می کنیم : DriverManagerDataSource
BasicDataSource
org.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) است و این ایده نمیداند که آیا همه چیز درست است یا خطایی وجود دارد. می توانید به تنظیمات ایده بروید و همه چیز را به صورت دستی تنظیم کنید (در صورت تمایل به اینترنت نگاه کنید). یا می توانید به سادگی پشتیبانی از چارچوب Hibernate اضافه کنید، برای انجام این کار، روی پروژه کلیک راست کرده، Add Framework Support را انتخاب کنید ، کادر Hibernate را علامت بزنید و OK را کلیک کنید. پس از این، به احتمال زیاد در کلاس موجودیت ( Film
) زیر بسیاری از چیزها نیز با قرمز خط کشیده می شود، به عنوان مثال، جایی که حاشیه نویسی @Table(name = "films")
اخطار را صادر می کند Cannot remove table 'films' . باز هم اینجا هیچ اشکالی ندارد، این یک خطای طراحی نیست، همه چیز کامپایل می شود و کار می کند. این ایده مورد تاکید قرار می گیرد زیرا چیزی در مورد پایگاه ما نمی داند. برای رفع این مشکل، بیایید این ایده را با پایگاه داده ادغام کنیم. مشاهده -> Tool Windows -> Persistense (یک برگه باز می شود) -> دکمه سمت راست ماوس، Assign Data Sources -> را در Data Source انتخاب کنید، اتصال به پایگاه داده را مشخص کنید و روی OK کلیک کنید . وقتی همه اینها درست شد، هنوز چیزی باقی مانده بود. بیایید به یک سطح بالاتر برویم، به سمت خدمات. در کلاس، متد بهار را با یک حاشیه FilmServiceImpl
مشخص می کنیم که نشان می دهد متد باید در یک تراکنش اجرا شود (بدون این، Hibernate از کار کردن خودداری می کند): allFilms
@Transactional
@Transactional
public List<Film> allFilms() {
return filmDAO.allFilms();
}
بنابراین، همه چیز در اینجا آماده است، لازم نیست چیزی را در کنترلر لمس کنید. خوب، به نظر می رسد که لحظه حقیقت فرا رسیده است، روی Run کلیک کنید و ببینید چه اتفاقی می افتد. و اینجاست، علامت ما، و این بار نه از فهرستی که خودمان درست در کلاس درست کردیم، بلکه از یک پایگاه داده به دست آمد. عالی، به نظر می رسد همه چیز کار می کند. اکنون سایر عملیات 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
. همین، آماده است. اکنون می توانید اجرا و بررسی کنید. روی پیوندها و دکمه ها کلیک کنید، سعی کنید ورودی ها را اضافه/حذف/ویرایش کنید. اگر همه چیز به درستی انجام شود باید کار کند. اکنون این یک برنامه CRUD تمام عیار با استفاده از Hibernate، Spring، MySQL است. ادامه دارد... معرفی Maven، Spring، MySQL، Hibernate و اولین برنامه CRUD (قسمت 1) معرفی Maven، Spring، MySQL، Hibernate و اولین برنامه CRUD (قسمت 2) معرفی Maven، Spring، MySQL، Hibernate و اولین برنامه CRUD (قسمت 3) مقدمه ای بر Maven، Spring، MySQL، Hibernate و اولین برنامه CRUD (قسمت 4)
GO TO FULL VERSION