1. ওভারভিউ
হাইবারনেট জাভা প্রকল্পের জন্য ডি ফ্যাক্টো স্ট্যান্ডার্ড ORM সমাধান হয়ে উঠেছে। এটি সমস্ত প্রধান রিলেশনাল ডেটাবেসকে সমর্থন করে এবং স্প্রিং ডেটা JPA- এর মতো আরও শক্তিশালী ORM টুলকে সক্ষম করে৷ এছাড়াও, অনেক হাইবারনেট-সামঞ্জস্যপূর্ণ ফ্রেমওয়ার্ক রয়েছে যেমন স্প্রিং বুট, মাইক্রোপ্রোফাইল এবং কোয়ার্কাস।
হাইবারনেট ওআরএম-এর জন্য ক্লাউড স্প্যানার ডায়ালেক্ট ক্লাউড স্প্যানারের সাথে হাইবারনেট ব্যবহার করা সম্ভব করে তোলে। আপনি ক্লাউড স্প্যানার-এর সুবিধা পাবেন - স্কেলেবিলিটি এবং রিলেশনাল সিমেন্টিকস - হাইবারনেটের ইডিওম্যাটিক অধ্যবসায়ের সাথে। এটি আপনাকে বিদ্যমান অ্যাপ্লিকেশনগুলিকে ক্লাউডে স্থানান্তরিত করতে বা হাইবারনেট-ভিত্তিক প্রযুক্তির দ্বারা প্রদত্ত বিকাশকারীর উত্পাদনশীলতা বৃদ্ধি করে নতুনগুলি লিখতে সহায়তা করতে পারে৷
আপনি কি শিখবেন
- ক্লাউড স্প্যানারের সাথে সংযোগকারী একটি সাধারণ হাইবারনেট অ্যাপ্লিকেশন কীভাবে লিখবেন
- কিভাবে একটি ক্লাউড স্প্যানার ডাটাবেস তৈরি করবেন
- হাইবারনেট ওআরএম-এর জন্য ক্লাউড স্প্যানার ডায়ালেক্ট কীভাবে ব্যবহার করবেন
- হাইবারনেটের সাথে ক্রিয়েট-রিড-আপডেট-ডিলিট (সিআরইউডি) অপারেশনগুলি কীভাবে বাস্তবায়ন করবেন
আপনি কি প্রয়োজন হবে
- একটি Google ক্লাউড প্ল্যাটফর্ম প্রকল্প
- একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স
2. সেটআপ এবং প্রয়োজনীয়তা
স্ব-গতিসম্পন্ন পরিবেশ সেটআপ
- ক্লাউড কনসোলে সাইন ইন করুন এবং একটি নতুন প্রকল্প তৈরি করুন বা বিদ্যমান একটি পুনরায় ব্যবহার করুন৷ (যদি আপনার ইতিমধ্যেই একটি Gmail বা G Suite অ্যাকাউন্ট না থাকে তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।)
প্রজেক্ট আইডিটি মনে রাখবেন, সমস্ত Google ক্লাউড প্রকল্প জুড়ে একটি অনন্য নাম (উপরের নামটি ইতিমধ্যে নেওয়া হয়েছে এবং আপনার জন্য কাজ করবে না, দুঃখিত!)। এটি পরে এই কোডল্যাবে PROJECT_ID
হিসাবে উল্লেখ করা হবে।
- এর পরে, Google ক্লাউড সংস্থানগুলি ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং সক্ষম করতে হবে৷
এই কোডল্যাবের মাধ্যমে চালানোর জন্য খুব বেশি খরচ করা উচিত নয়, যদি কিছু থাকে। "ক্লিনিং আপ" বিভাগে যে কোনও নির্দেশাবলী অনুসরণ করতে ভুলবেন না যা আপনাকে কীভাবে সংস্থানগুলি বন্ধ করতে হবে তা পরামর্শ দেয় যাতে আপনি এই টিউটোরিয়ালের বাইরে বিলিং করতে না পারেন৷ Google ক্লাউডের নতুন ব্যবহারকারীরা $300USD ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য৷
ক্লাউড শেল সক্রিয় করুন
- ক্লাউড কনসোল থেকে, ক্লাউড শেল সক্রিয় করুন ক্লিক করুন .
আপনি যদি আগে কখনও ক্লাউড শেল শুরু না করে থাকেন, তাহলে আপনাকে একটি মধ্যবর্তী স্ক্রীন (ভাঁজের নীচে) উপস্থাপন করা হবে যা বর্ণনা করে। যদি এটি হয়, তবে চালিয়ে যান ক্লিক করুন (এবং আপনি এটি আর কখনও দেখতে পাবেন না)। এককালীন স্ক্রীনটি দেখতে কেমন তা এখানে রয়েছে:
ক্লাউড শেলের সাথে সংযোগ করতে এবং সংযোগ করতে এটির মাত্র কয়েক মুহূর্ত লাগবে৷
এই ভার্চুয়াল মেশিনটি আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুল দিয়ে লোড করা হয়েছে। এটি একটি ক্রমাগত 5GB হোম ডিরেক্টরি অফার করে এবং Google ক্লাউডে চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার অনেক কাজ, যদি সব না হয়, শুধুমাত্র একটি ব্রাউজার বা আপনার Chromebook দিয়ে করা যেতে পারে।
একবার ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি দেখতে পাবেন যে আপনি ইতিমধ্যেই প্রমাণীকরণ করেছেন এবং প্রকল্পটি ইতিমধ্যে আপনার প্রকল্প আইডিতে সেট করা আছে।
- আপনি প্রমাণীকৃত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud auth list
কমান্ড আউটপুট
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
কমান্ড আউটপুট
[core] project = <PROJECT_ID>
যদি এটি না হয়, আপনি এই কমান্ড দিয়ে এটি সেট করতে পারেন:
gcloud config set project <PROJECT_ID>
কমান্ড আউটপুট
Updated property [core/project].
3. একটি ডাটাবেস তৈরি করুন
ক্লাউড শেল চালু হওয়ার পরে, আপনি আপনার GCP প্রকল্পের সাথে ইন্টারঅ্যাক্ট করতে gcloud
ব্যবহার শুরু করতে পারেন।
প্রথমে, Cloud Spanner API সক্ষম করুন।
gcloud services enable spanner.googleapis.com
এখন, codelab-instance
নামে একটি ক্লাউড স্প্যানার ইনস্ট্যান্স তৈরি করা যাক।
gcloud spanner instances create codelab-instance \ --config=regional-us-central1 \ --description="Codelab Instance" --nodes=1
এখন, আমাদের এই উদাহরণে একটি ডাটাবেস যোগ করতে হবে। আমরা এটিকে codelab-db
বলব।
gcloud spanner databases create codelab-db --instance=codelab-instance
4. একটি খালি অ্যাপ তৈরি করুন
আমরা একটি সাধারণ জাভা কনসোল অ্যাপ্লিকেশন তৈরি করতে মাভেন কুইকস্টার্ট আর্কিটাইপ ব্যবহার করব।
mvn archetype:generate \ -DgroupId=codelab \ -DartifactId=spanner-hibernate-codelab \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DarchetypeVersion=1.4 \ -DinteractiveMode=false
অ্যাপ ডিরেক্টরিতে পরিবর্তন করুন।
cd spanner-hibernate-codelab
Maven ব্যবহার করে অ্যাপ কম্পাইল করুন এবং রান করুন।
mvn compile exec:java -Dexec.mainClass=codelab.App
আপনি Hello World!
কনসোলে মুদ্রিত।
5. নির্ভরতা যোগ করুন
আসুন ক্লাউড শেল এডিটর খোলার মাধ্যমে এবং spanner-hibernate-codelab
ডিরেক্টরির ভিতরে ব্রাউজ করে সোর্স কোডটি অন্বেষণ করি।
এখন পর্যন্ত, আমাদের কাছে শুধু একটি বেসিক জাভা কনসোল অ্যাপ আছে যা "Hello World!"
প্রিন্ট করে। . যাইহোক, আমরা সত্যিই একটি জাভা অ্যাপ্লিকেশন লিখতে চাই যা ক্লাউড স্প্যানারের সাথে কথা বলার জন্য হাইবারনেট ব্যবহার করে। এর জন্য, আমাদের হাইবারনেটের জন্য ক্লাউড স্প্যানার ডায়ালেক্ট, ক্লাউড স্প্যানার JDBC ড্রাইভার এবং হাইবারনেট কোরের প্রয়োজন হবে। সুতরাং, pom.xml
ফাইলের ভিতরে <dependencies>
ব্লকে নিম্নলিখিত নির্ভরতা যোগ করা যাক।
pom.xml
<!-- Spanner Dialect -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-spanner-hibernate-dialect</artifactId>
<version>1.5.0</version>
</dependency>
<!-- JDBC Driver -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-spanner-jdbc</artifactId>
<version>2.0.0</version>
</dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.29.Final</version>
</dependency>
6. হাইবারনেট ORM কনফিগার করুন
এর পরে, আমরা হাইবারনেট কনফিগারেশন ফাইল hibernate.cfg.xml
এবং hibernate.properties
তৈরি করব। খালি ফাইলগুলি তৈরি করতে নিম্নলিখিত কমান্ডটি চালান এবং তারপরে ক্লাউড শেল এডিটর ব্যবহার করে সেগুলি সম্পাদনা করুন।
mkdir src/main/resources \ && touch src/main/resources/hibernate.cfg.xml \ && touch src/main/resources/hibernate.properties
সুতরাং, আসুন হাইবারনেটকে টীকাযুক্ত সত্তা ক্লাস সম্পর্কে বলি আমরা hibernate.cfg.xml
পূরণ করে ডাটাবেসে ম্যাপিং করব। (আমরা পরে সত্তা ক্লাস তৈরি করব।)
src/main/resources/hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<!-- Annotated entity classes -->
<mapping class="codelab.Album"/>
<mapping class="codelab.Singer"/>
</session-factory>
</hibernate-configuration>
হাইবারনেটকে ক্লাউড স্প্যানার ইনস্ট্যান্সের সাথে কীভাবে সংযোগ করতে হবে এবং কোন উপভাষাটি ব্যবহার করতে হবে তাও জানতে হবে। সুতরাং, আমরা এসকিউএল সিনট্যাক্স, স্প্যানার জেডিবিসি ড্রাইভার, এবং ডাটাবেস স্থানাঙ্কের সাথে জেডিবিসি সংযোগ স্ট্রিংয়ের জন্য SpannerDialect
ব্যবহার করতে বলব। এটি hibernate.properties
ফাইলে যায়।
src/main/resources/hibernate.properties
hibernate.dialect=com.google.cloud.spanner.hibernate.SpannerDialect hibernate.connection.driver_class=com.google.cloud.spanner.jdbc.JdbcDriver hibernate.connection.url=jdbc:cloudspanner:/projects/{PROJECT_ID}/instances/codelab-instance/databases/codelab-db # auto-create or update DB schema hibernate.hbm2ddl.auto=update hibernate.show_sql=true
আপনার প্রজেক্ট আইডি দিয়ে {PROJECT_ID}
প্রতিস্থাপন করতে ভুলবেন না, যা আপনি নিম্নলিখিত কমান্ড চালানোর মাধ্যমে পেতে পারেন:
gcloud config get-value project
যেহেতু আমাদের কোনো বিদ্যমান ডাটাবেস স্কিমা নেই, তাই আমরা প্রথমবার অ্যাপটি চালানোর সময় হাইবারনেটকে ক্লাউড স্প্যানারে দুটি টেবিল তৈরি করতে দিতে hibernate.hbm2ddl.auto=update
প্রপার্টি যোগ করেছি।
সাধারণত, আপনি নিশ্চিত করবেন যে GOOGLE_APPLICATION_CREDENTIALS
পরিবেশ ভেরিয়েবলে একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল ব্যবহার করে অথবা gcloud auth application-default login
কমান্ড ব্যবহার করে কনফিগার করা অ্যাপ্লিকেশন ডিফল্ট শংসাপত্রগুলি ব্যবহার করে প্রমাণীকরণ শংসাপত্রগুলি সেট আপ করা হয়েছে৷ যাইহোক, যেহেতু আমরা ক্লাউড শেলে চলছি, ডিফল্ট প্রকল্পের শংসাপত্রগুলি ইতিমধ্যেই সেট আপ করা হয়েছে।
7. টীকাযুক্ত সত্তা ক্লাস তৈরি করুন
এখন আমরা কিছু কোড লিখতে প্রস্তুত।
আমরা দুটি সাধারণ পুরানো জাভা অবজেক্ট (POJOs) সংজ্ঞায়িত করব যা ক্লাউড স্প্যানার- Singer
এবং Album
টেবিলে ম্যাপ করবে। Album
Singer
সাথে @ManyToOne
সম্পর্ক থাকবে। আমরা @OneToMany
টীকা দিয়ে Singer
তাদের Album
তালিকায় ম্যাপ করতে পারতাম, কিন্তু এই উদাহরণের জন্য, ডাটাবেস থেকে একজন গায়ককে আনার জন্য আমরা আসলেই সব অ্যালবাম লোড করতে চাই না।
Singer
এবং Album
সত্তা ক্লাস যোগ করুন।
ক্লাস ফাইল তৈরি করুন।
touch src/main/java/codelab/Singer.java \ && touch src/main/java/codelab/Album.java
ফাইলের বিষয়বস্তু পেস্ট করুন।
src/main/java/codelab/Singer.java
package codelab;
import java.util.Date;
import java.util.UUID;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.Type;
@Entity
public class Singer {
@Id
@GeneratedValue
@Type(type = "uuid-char")
private UUID singerId;
private String firstName;
private String lastName;
@Temporal(TemporalType.DATE)
private Date birthDate;
public Singer() {
}
public Singer(String firstName, String lastName, Date birthDate) {
this.firstName = firstName;
this.lastName = lastName;
this.birthDate = birthDate;
}
public UUID getSingerId() {
return singerId;
}
public void setSingerId(UUID singerId) {
this.singerId = singerId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Singer)) {
return false;
}
Singer singer = (Singer) o;
if (!firstName.equals(singer.firstName)) {
return false;
}
if (!lastName.equals(singer.lastName)) {
return false;
}
return birthDate.equals(singer.birthDate);
}
@Override
public int hashCode() {
int result = firstName.hashCode();
result = 31 * result + lastName.hashCode();
result = 31 * result + birthDate.hashCode();
return result;
}
}
src/main/java/codelab/Album.java
package codelab;
import java.util.UUID;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import org.hibernate.annotations.Type;
@Entity
public class Album {
@Id
@GeneratedValue
@Type(type = "uuid-char")
UUID albumId;
@ManyToOne
Singer singer;
String albumTitle;
public Album() {
}
public Album(Singer singer, String albumTitle) {
this.singer = singer;
this.albumTitle = albumTitle;
}
public UUID getAlbumId() {
return albumId;
}
public void setAlbumId(UUID albumId) {
this.albumId = albumId;
}
public Singer getSinger() {
return singer;
}
public void setSinger(Singer singer) {
this.singer = singer;
}
public String getAlbumTitle() {
return albumTitle;
}
public void setAlbumTitle(String albumTitle) {
this.albumTitle = albumTitle;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Album)) {
return false;
}
Album album = (Album) o;
if (!singer.equals(album.singer)) {
return false;
}
return albumTitle.equals(album.albumTitle);
}
@Override
public int hashCode() {
int result = singer.hashCode();
result = 31 * result + albumTitle.hashCode();
return result;
}
}
লক্ষ্য করুন যে এই উদাহরণের জন্য আমরা প্রাথমিক কী-এর জন্য একটি স্বয়ংক্রিয়-উৎপন্ন UUID ব্যবহার করছি। এটি ক্লাউড স্প্যানারে একটি পছন্দের আইডি টাইপ, কারণ এটি হটস্পটগুলি এড়িয়ে যায় কারণ সিস্টেমটি সার্ভারগুলির মধ্যে কী রেঞ্জ দ্বারা ডেটা ভাগ করে৷ একটি একঘেয়ে ক্রমবর্ধমান পূর্ণসংখ্যা কীও কাজ করবে, তবে কম কার্যকারিতা হতে পারে।
8. সত্তা সংরক্ষণ করুন এবং অনুসন্ধান করুন
সবকিছু কনফিগার করা এবং সত্তা অবজেক্ট সংজ্ঞায়িত করে, আমরা ডাটাবেসে লেখা শুরু করতে পারি এবং এটি অনুসন্ধান করতে পারি। আমরা একটি হাইবারনেট Session
খুলব, এবং তারপর এটিকে প্রথমে clearData()
পদ্ধতিতে সমস্ত টেবিল সারি মুছে ফেলতে ব্যবহার করব, writeData()
পদ্ধতিতে কিছু সত্তা সংরক্ষণ করব এবং readData()
(HQL) হাইবারনেট কোয়েরি ভাষা ব্যবহার করে কিছু প্রশ্ন চালাব। readData()
পদ্ধতি।
App.java
এর বিষয়বস্তুগুলিকে নিম্নলিখিত দিয়ে প্রতিস্থাপন করুন:
src/main/java/codelab/App.java
package codelab;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
public class App {
public final static DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
public static void main(String[] args) {
// create a Hibernate sessionFactory and session
StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata()
.buildSessionFactory();
Session session = sessionFactory.openSession();
clearData(session);
writeData(session);
readData(session);
// close Hibernate session and sessionFactory
session.close();
sessionFactory.close();
}
private static void clearData(Session session) {
session.beginTransaction();
session.createQuery("delete from Album where 1=1").executeUpdate();
session.createQuery("delete from Singer where 1=1").executeUpdate();
session.getTransaction().commit();
}
private static void writeData(Session session) {
session.beginTransaction();
Singer singerMelissa = new Singer("Melissa", "Garcia", makeDate("1981-03-19"));
Album albumGoGoGo = new Album(singerMelissa, "Go, Go, Go");
session.save(singerMelissa);
session.save(albumGoGoGo);
session.save(new Singer("Russell", "Morales", makeDate("1978-12-02")));
session.save(new Singer("Jacqueline", "Long", makeDate("1990-07-29")));
session.save(new Singer("Dylan", "Shaw", makeDate("1998-05-02")));
session.getTransaction().commit();
}
private static void readData(Session session) {
List<Singer> singers = session.createQuery("from Singer where birthDate >= '1990-01-01' order by lastName")
.list();
List<Album> albums = session.createQuery("from Album").list();
System.out.println("Singers who were born in 1990 or later:");
for (Singer singer : singers) {
System.out.println(singer.getFirstName() + " " + singer.getLastName() + " born on "
+ DATE_FORMAT.format(singer.getBirthDate()));
}
System.out.println("Albums: ");
for (Album album : albums) {
System.out
.println("\"" + album.getAlbumTitle() + "\" by " + album.getSinger().getFirstName() + " "
+ album.getSinger().getLastName());
}
}
private static Date makeDate(String dateString) {
try {
return DATE_FORMAT.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}
এখন, কোড কম্পাইল করে রান করা যাক। আমরা ডেমন থ্রেড পরিষ্কার করার বিষয়ে সতর্কতা দমন করতে -Dexec.cleanupDaemonThreads=false
বিকল্পটি যোগ করব যা Maven করার চেষ্টা করবে।
mvn compile exec:java -Dexec.mainClass=codelab.App -Dexec.cleanupDaemonThreads=false
আউটপুটে আপনি এই মত কিছু দেখতে হবে:
Singers who were born in 1990 or later: Jacqueline Long born on 1990-07-29 Dylan Shaw born on 1998-05-02 Albums: "Go, Go, Go" by Melissa Garcia
এই মুহুর্তে, আপনি যদি ক্লাউড স্প্যানার কনসোলে যান এবং ডাটাবেসে সিঙ্গার এবং অ্যালবাম টেবিলের ডেটা দেখেন, আপনি এইরকম কিছু দেখতে পাবেন:
9. পরিষ্কার করুন
ক্লাউড স্প্যানার ইন্সট্যান্সটি মুছে ফেলি যা আমরা শুরুতে তৈরি করেছি তা নিশ্চিত করতে যে এটি অপ্রয়োজনীয়ভাবে সংস্থানগুলি ব্যবহার করছে না।
gcloud spanner instances delete codelab-instance
10. অভিনন্দন
অভিনন্দন, আপনি সফলভাবে একটি জাভা অ্যাপ্লিকেশন তৈরি করেছেন যা ক্লাউড স্প্যানারে ডেটা বজায় রাখতে হাইবারনেট ব্যবহার করে।
- আপনি একটি ক্লাউড স্প্যানার উদাহরণ এবং একটি ডাটাবেস তৈরি করেছেন৷
- আপনি হাইবারনেট ব্যবহার করার জন্য অ্যাপ্লিকেশনটি কনফিগার করেছেন৷
- আপনি দুটি সত্তা তৈরি করেছেন: শিল্পী এবং অ্যালবাম৷
- আপনি আপনার অ্যাপ্লিকেশনের জন্য স্বয়ংক্রিয়ভাবে ডাটাবেস স্কিমা তৈরি করেছেন
- আপনি সফলভাবে ক্লাউড স্প্যানারে সত্তাগুলি সংরক্ষণ করেছেন এবং তাদের জিজ্ঞাসা করেছেন৷
আপনি এখন ক্লাউড স্প্যানার দিয়ে হাইবারনেট অ্যাপ্লিকেশন লিখতে প্রয়োজনীয় মূল পদক্ষেপগুলি জানেন৷