Hazırda Bekletme - Hızlı Kılavuz
JDBC nedir?
JDBC, Java Database Connectivity. Java programından ilişkisel veritabanlarına erişmek için bir dizi Java API sağlar. Bu Java API'leri, Java programlarının SQL ifadelerini yürütmesini ve herhangi bir SQL uyumlu veritabanıyla etkileşime girmesini sağlar.
JDBC, farklı platformlarda çalışabilen ve herhangi bir değişiklik yapmadan farklı DBMS ile etkileşime girebilen veritabanından bağımsız bir uygulama yazmak için esnek bir mimari sağlar.
JDBC'nin Artıları ve Eksileri
JDBC'nin Artıları | JDBC'nin Eksileri |
---|---|
Temiz ve basit SQL işleme Büyük verilerle iyi performans Küçük uygulamalar için çok iyi Basit sözdizimi öğrenmesi çok kolay |
Büyük projelerde kullanılıyorsa karmaşık Büyük programlama ek yükü Kapsülleme yok MVC konseptini uygulamak zor Sorgu, DBMS'ye özgüdür |
Neden Nesne İlişkisel Haritalama (ORM)?
Nesne yönelimli bir sistemle çalıştığımızda, nesne modeli ile ilişkisel veritabanı arasında bir uyumsuzluk vardır. RDBMS'ler verileri tablo biçiminde temsil ederken, Java veya C # gibi nesne yönelimli diller, nesnelerin birbirine bağlı bir grafiği olarak temsil eder.
Uygun oluşturuculara ve ilişkili genel işlevlere sahip aşağıdaki Java Sınıfını göz önünde bulundurun -
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public String getFirstName() {
return first_name;
}
public String getLastName() {
return last_name;
}
public int getSalary() {
return salary;
}
}
Yukarıdaki nesnelerin aşağıdaki RDBMS tablosunda depolanacağını ve geri alınacağını düşünün -
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
İlk sorun, birkaç sayfa veya uygulamamızı geliştirdikten sonra veritabanımızın tasarımını değiştirmemiz gerekirse ne olur? İkinci olarak, nesnelerin ilişkisel bir veritabanına yüklenmesi ve depolanması bizi aşağıdaki beş uyumsuzluk sorununa maruz bırakır:
Sr.No. | Uyumsuzluk ve Açıklama |
---|---|
1 | Granularity Bazen, veritabanındaki karşılık gelen tabloların sayısından daha fazla sınıf içeren bir nesne modeliniz olacaktır. |
2 | Inheritance RDBMS'ler, nesne yönelimli programlama dillerinde doğal bir paradigma olan Miras'a benzer bir şey tanımlamaz. |
3 | Identity Bir RDBMS, tam olarak bir 'aynılık' kavramını tanımlar: birincil anahtar. Bununla birlikte Java, hem nesne kimliğini (a == b) hem de nesne eşitliğini (a.equals (b)) tanımlar. |
4 | Associations Nesne yönelimli diller, nesne referanslarını kullanan ilişkileri temsil ederken, RDBMS, yabancı anahtar sütunu olarak bir ilişkilendirmeyi temsil eder. |
5 | Navigation Java ve RDBMS'deki nesnelere erişme yolları temelde farklıdır. |
OhedefRneşeli Mapping (ORM), yukarıdaki tüm empedans uyumsuzluklarının üstesinden gelmek için bir çözümdür.
ORM nedir?
ORM'nin kısaltması OhedefRneşeli Mapping (ORM), ilişkisel veritabanları ile Java, C # vb. nesne yönelimli programlama dilleri arasında veri dönüştürmek için kullanılan bir programlama tekniğidir.
Bir ORM sistemi, düz JDBC'ye göre aşağıdaki avantajlara sahiptir:
Sr.No. | Avantajlar |
---|---|
1 | DB tabloları yerine iş kodlarına erişelim. |
2 | OO mantığından SQL sorgularının ayrıntılarını gizler. |
3 | JDBC'ye göre "kaputun altında." |
4 | Veritabanı uygulamasıyla uğraşmanıza gerek yok. |
5 | Varlıklar veritabanı yapısından ziyade iş kavramlarına dayalıdır. |
6 | İşlem yönetimi ve otomatik anahtar oluşturma. |
7 | Hızlı uygulama geliştirme. |
Bir ORM çözümü aşağıdaki dört varlıktan oluşur:
Sr.No. | Çözümler |
---|---|
1 | Kalıcı sınıfların nesneleri üzerinde temel CRUD işlemlerini gerçekleştirmek için bir API. |
2 | Sınıfların sınıflarına ve özelliklerine başvuran sorguları belirtmek için bir dil veya API. |
3 | Eşleme meta verilerini belirtmek için yapılandırılabilir bir tesis. |
4 | Kirli denetim, tembel ilişkilendirme getirme ve diğer optimizasyon işlevlerini gerçekleştirmek için işlem nesneleriyle etkileşim kurma tekniği. |
Java ORM Çerçeveleri
Java'da birkaç kalıcı çerçeve ve ORM seçeneği vardır. Kalıcı çerçeve, nesneleri ilişkisel bir veritabanında depolayan ve alan bir ORM hizmetidir.
- Kurumsal JavaBeans Varlık Çekirdekleri
- Java Veri Nesneleri
- Castor
- TopLink
- Bahar DAO
- Hibernate
- Ve daha fazlası
Hazırda bekletme bir OhedefRneşeli MJAVA için uygulama (ORM) çözümü. 2001 yılında Gavin King tarafından oluşturulan açık kaynaklı kalıcı bir çerçevedir. Herhangi bir Java Uygulaması için güçlü, yüksek performanslı bir Nesne-İlişkisel Kalıcılık ve Sorgu hizmetidir.
Hibernate, Java sınıflarını veritabanı tablolarına ve Java veri türlerinden SQL veri türlerine eşler ve geliştiriciyi, ortak veri kalıcılığı ile ilgili programlama görevlerinin% 95'inden kurtarır.
Hazırda bekletme, bu nesnelerin uygun O / R mekanizmalarına ve kalıplarına dayalı olarak sürdürülmesine yönelik tüm çalışmaları yürütmek için geleneksel Java nesneleri ile veritabanı sunucusu arasında oturur.
Hazırda Bekletme Avantajları
Hibernate, XML dosyalarını kullanarak ve herhangi bir kod satırı yazmadan Java sınıflarını veritabanı tablolarıyla eşleştirmeyi sağlar.
Java nesnelerini doğrudan veritabanına ve veritabanından depolamak ve almak için basit API'ler sağlar.
Veritabanında veya herhangi bir tabloda değişiklik varsa, yalnızca XML dosyası özelliklerini değiştirmeniz gerekir.
Alışılmadık SQL türlerini özetler ve tanıdık Java Nesneleri etrafında çalışma yolu sağlar.
Hazırda bekletme, çalışmak için bir uygulama sunucusuna ihtiyaç duymaz.
Veritabanınızdaki nesnelerin karmaşık ilişkilerini düzenler.
Akıllı getirme stratejileriyle veritabanı erişimini en aza indirir.
Verilerin basit bir şekilde sorgulanmasını sağlar.
Desteklenen Veritabanları
Hazırda bekletme hemen hemen tüm ana RDBMS'yi destekler. Hibernate tarafından desteklenen veritabanı motorlarından birkaçının listesi aşağıdadır -
- HSQL Veritabanı Motoru
- DB2/NT
- MySQL
- PostgreSQL
- FrontBase
- Oracle
- Microsoft SQL Server Veritabanı
- Sybase SQL Sunucusu
- Informix Dinamik Sunucu
Desteklenen Teknolojiler
Hibernate, aşağıdakiler de dahil olmak üzere çeşitli diğer teknolojileri destekler:
- XDoclet Yayı
- J2EE
- Eclipse eklentileri
- Maven
Hibernate, kullanıcının temel API'leri bilmek zorunda kalmadan çalışmasına yardımcı olan katmanlı bir mimariye sahiptir. Hibernate, uygulamaya kalıcılık hizmetleri (ve kalıcı nesneler) sağlamak için veritabanı ve yapılandırma verilerini kullanır.
Aşağıda, Hibernate Uygulama Mimarisinin çok üst düzey bir görünümü yer almaktadır.
Aşağıda, önemli çekirdek sınıflarıyla birlikte Hazırda Bekletme Uygulama Mimarisinin ayrıntılı bir görünümü verilmiştir.
Hibernate, JDBC, Java Transaction API (JTA) ve Java Adlandırma ve Dizin Arayüzü (JNDI) gibi çeşitli mevcut Java API'lerini kullanır. JDBC, ilişkisel veritabanlarında ortak olan temel bir işlevsellik soyutlama düzeyi sağlar ve JDBC sürücüsüne sahip hemen hemen her veritabanının Hibernate tarafından desteklenmesine olanak tanır. JNDI ve JTA, Hibernate'in J2EE uygulama sunucuları ile entegre olmasına izin verir.
Aşağıdaki bölüm, Hazırda Bekletme Uygulama Mimarisinde yer alan her bir sınıf nesnesinin kısa açıklamasını verir.
Yapılandırma Nesnesi
Yapılandırma nesnesi, herhangi bir Hazırda Bekletme uygulamasında oluşturduğunuz ilk Hazırda Beklet nesnesidir. Genellikle uygulama başlatma sırasında yalnızca bir kez oluşturulur. Hazırda Bekletme için gerekli olan bir yapılandırma veya özellikler dosyasını temsil eder.
Yapılandırma nesnesi iki anahtar bileşeni sağlar -
Database Connection- Bu, Hazırda Bekletme tarafından desteklenen bir veya daha fazla yapılandırma dosyası aracılığıyla gerçekleştirilir. Bu dosyalarhibernate.properties ve hibernate.cfg.xml.
Class Mapping Setup - Bu bileşen, Java sınıfları ve veritabanı tabloları arasındaki bağlantıyı oluşturur.
SessionFactory Nesnesi
Yapılandırma nesnesi, sağlanan yapılandırma dosyasını kullanarak uygulama için Hazırda Bekletmeyi yapılandıran ve bir Session nesnesinin somutlaştırılmasına izin veren bir SessionFactory nesnesi oluşturmak için kullanılır. SessionFactory, iş parçacığı güvenli bir nesnedir ve bir uygulamanın tüm iş parçacıkları tarafından kullanılır.
SessionFactory ağır bir nesnedir; genellikle uygulama başlatılırken oluşturulur ve daha sonra kullanılmak üzere saklanır. Ayrı bir yapılandırma dosyası kullanarak veritabanı başına bir SessionFactory nesnesine ihtiyacınız olacaktır. Dolayısıyla, birden çok veritabanı kullanıyorsanız, birden çok SessionFactory nesnesi oluşturmanız gerekir.
Oturum Nesnesi
Bir Oturum, bir veritabanı ile fiziksel bir bağlantı kurmak için kullanılır. Session nesnesi hafiftir ve veritabanıyla her etkileşim gerektiğinde örneklenecek şekilde tasarlanmıştır. Kalıcı nesneler kaydedilir ve bir Session nesnesi aracılığıyla alınır.
Oturum nesneleri uzun süre açık tutulmamalıdır çünkü bunlar genellikle iş parçacığı açısından güvenli değildir ve gerektiğinde yaratılmalı ve yok edilmelidir.
İşlem Nesnesi
Bir İşlem, veritabanıyla bir çalışma birimini temsil eder ve RDBMS'nin çoğu işlem işlevselliğini destekler. Hibernate'deki işlemler, temel bir işlem yöneticisi ve işlem (JDBC veya JTA'dan) tarafından ele alınır.
Bu, isteğe bağlı bir nesnedir ve Hazırda Bekletme uygulamaları, işlemleri kendi uygulama kodlarında yönetmek yerine bu arabirimi kullanmamayı seçebilir.
Sorgu Nesnesi
Sorgu nesneleri, veritabanından veri almak ve nesneler oluşturmak için SQL veya Hazırda Bekletme Sorgu Dili (HQL) dizesini kullanır. Bir Sorgu örneği, sorgu parametrelerini bağlamak, sorgu tarafından döndürülen sonuçların sayısını sınırlamak ve son olarak sorguyu yürütmek için kullanılır.
Ölçüt Nesnesi
Ölçüt nesneleri, nesneleri almak için nesne yönelimli ölçüt sorguları oluşturmak ve yürütmek için kullanılır.
Bu bölümde, Hazırda Bekletme uygulamaları için bir ortam hazırlamak üzere Hazırda Bekletme ve diğer ilgili paketlerin nasıl kurulacağı açıklanmaktadır. Hazırda Bekletme örneklerini denemek için MySQL veritabanıyla çalışacağız, bu nedenle MySQL veritabanı için zaten bir kurulumunuz olduğundan emin olun. MySQL hakkında daha fazla ayrıntı için MySQL Eğitimimize göz atabilirsiniz .
Hazırda Bekletme İndiriliyor
Sisteminizde Java'nın en son sürümünün zaten yüklü olduğu varsayılmaktadır. Aşağıda, Sisteminize Hazırda Bekletme'yi indirip kurmanın basit adımları verilmiştir -
Hazırda Bekletme'yi Windows'a mı yoksa Unix'e mi yüklemek istediğinizi seçin ve ardından Windows için .zip dosyasını ve Unix için .tz dosyasını indirmek için bir sonraki adıma geçin.
Hibernate'in en son sürümünü şuradan indirin: http://www.hibernate.org/downloads.
Bu öğreticiyi yazarken, indirdim hibernate-distribution3.6.4.Final ve indirilen dosyayı açtığınızda, aşağıdaki görüntüde gösterildiği gibi size dizin yapısını verecektir.
Hazırda Bekletme Yükleniyor
Hazırda Bekletme Kurulum dosyasının en son sürümünü indirip açtıktan sonra, aşağıdaki iki basit adımı gerçekleştirmeniz gerekir. CLASSPATH değişkeninizi doğru şekilde ayarladığınızdan emin olun, aksi takdirde uygulamanızı derlerken sorunla karşılaşacaksınız.
Şimdi, tüm kitaplık dosyalarını kopyalayın /lib CLASSPATH'inize girin ve sınıf yolu değişkeninizi tüm JAR'ları içerecek şekilde değiştirin -
Son olarak, kopyalayın hibernate3.jardosyasını CLASSPATH'ınıza yükleyin. Bu dosya, kurulumun kök dizininde bulunur ve Hazırda Bekletme'nin işini yapması için gereken birincil JAR'dır.
Hazırda Bekletme Önkoşulları
Aşağıda, Hazırda Bekletme için gereken paketlerin / kitaplıkların listesi bulunmaktadır ve Hazırda Bekletme'ye başlamadan önce bunları yüklemeniz gerekir. Bu paketleri kurmak için, kitaplık dosyalarını şuradan kopyalamanız gerekecek/lib CLASSPATH'inize girin ve CLASSPATH değişkeninizi buna göre değiştirin.
Sr.No. | Paketler / Kitaplıklar |
---|---|
1 | dom4j XML ayrıştırma www.dom4j.org/ |
2 | Xalan XSLT İşlemci https://xml.apache.org/xalan-j/ |
3 | Xerces Xerces Java Ayrıştırıcısı https://xml.apache.org/xerces-j/ |
4 | cglib Çalışma zamanında Java sınıflarında uygun değişiklikler http://cglib.sourceforge.net/ |
5 | log4j Faremwork Günlüğü https://logging.apache.org/log4j |
6 | Commons Günlük kaydı, E-posta vb. https://jakarta.apache.org/commons |
7 | SLF4J Java için Logging Facade https://www.slf4j.org |
Hazırda bekletme, Java sınıflarınızın veritabanı tablolarıyla nasıl ilişkili olduğunu tanımlayan eşleme bilgilerinin nerede bulunacağını önceden bilmeyi gerektirir. Hazırda bekletme ayrıca veritabanı ve diğer ilgili parametrelerle ilgili bir dizi yapılandırma ayarı gerektirir. Bu tür tüm bilgiler genellikle standart bir Java özellikleri dosyası olarak sağlanır.hibernate.propertiesveya adlı bir XML dosyası olarak hibernate.cfg.xml.
XML formatlı dosyayı dikkate alacağım hibernate.cfg.xmlÖrneklerimde gerekli Hazırda Bekletme özelliklerini belirtmek için. Özelliklerin çoğu varsayılan değerlerini alır ve gerçekten gerekli olmadıkça özellik dosyasında belirtilmesi gerekmez. Bu dosya, uygulamanızın sınıf yolunun kök dizininde tutulur.
Hazırda Bekletme Özellikleri
Aşağıda, önemli özelliklerin listesi verilmiştir, bağımsız bir durumda bir veritabanları için yapılandırmanız gerekecektir -
Sr.No. | Özellikler ve Açıklama |
---|---|
1 | hibernate.dialect Bu özellik, Hibernate'in seçilen veritabanı için uygun SQL'i oluşturmasını sağlar. |
2 | hibernate.connection.driver_class JDBC sürücü sınıfı. |
3 | hibernate.connection.url Veritabanı örneğinin JDBC URL'si. |
4 | hibernate.connection.username Veritabanı kullanıcı adı. |
5 | hibernate.connection.password Veritabanı şifresi. |
6 | hibernate.connection.pool_size Hazırda Beklet veritabanı bağlantı havuzunda bekleyen bağlantıların sayısını sınırlar. |
7 | hibernate.connection.autocommit JDBC bağlantısı için otomatik yürütme modunun kullanılmasına izin verir. |
Bir uygulama sunucusu ve JNDI ile birlikte bir veritabanı kullanıyorsanız, aşağıdaki özellikleri yapılandırmanız gerekir -
Sr.No. | Özellikler ve Açıklama |
---|---|
1 | hibernate.connection.datasource Uygulama için kullandığınız uygulama sunucusu bağlamında tanımlanan JNDI adı. |
2 | hibernate.jndi.class JNDI için InitialContext sınıfı. |
3 | hibernate.jndi.<JNDIpropertyname> İstediğiniz herhangi bir JNDI özelliğini JNDI InitialContext'e aktarır . |
4 | hibernate.jndi.url JNDI için URL sağlar. |
5 | hibernate.connection.username Veritabanı kullanıcı adı. |
6 | hibernate.connection.password Veritabanı şifresi. |
MySQL Veritabanı ile Hazırda Bekletme
MySQL, bugün mevcut olan en popüler açık kaynaklı veritabanı sistemlerinden biridir. Yaratalımhibernate.cfg.xmlyapılandırma dosyasını bulun ve uygulamanızın sınıf yolunun kök dizinine yerleştirin. Sahip olduğunuzdan emin olmalısınıztestdb veritabanı MySQL veritabanınızda mevcut ve bir kullanıcınız var test veritabanına erişmek için kullanılabilir.
XML yapılandırma dosyası, aşağıdaki adreste bulunan Hibernate 3 Configuration DTD ile uyumlu olmalıdır. http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd.
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name = "hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name = "hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- Assume test is the database name -->
<property name = "hibernate.connection.url">
jdbc:mysql://localhost/test
</property>
<property name = "hibernate.connection.username">
root
</property>
<property name = "hibernate.connection.password">
root123
</property>
<!-- List of XML mapping files -->
<mapping resource = "Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Yukarıdaki yapılandırma dosyası şunları içerir: <mapping> hazırda haritalama dosyası ile ilgili olan etiketleri ve sonraki bölümde göreceğimiz hazırda haritalama dosyasının tam olarak ne olduğunu ve onu nasıl ve neden kullanıyoruz?
Aşağıda, çeşitli önemli veri tabanlarının listesi bulunmaktadır. Diyalekt özellik türü -
Sr.No. | Veritabanı ve Ağız Özelliği |
---|---|
1 | DB2 org.hibernate.dialect.DB2Dialect |
2 | HSQLDB org.hibernate.dialect.HSQLDialect |
3 | HypersonicSQL org.hibernate.dialect.HSQLDialect |
4 | Informix org.hibernate.dialect.InformixDialect |
5 | Ingres org.hibernate.dialect.IngresDialect |
6 | Interbase org.hibernate.dialect.InterbaseDialect |
7 | Microsoft SQL Server 2000 org.hibernate.dialect.SQLServerDialect |
8 | Microsoft SQL Server 2005 org.hibernate.dialect.SQLServer2005Dialect |
9 | Microsoft SQL Server 2008 org.hibernate.dialect.SQLServer2008Dialect |
10 | MySQL org.hibernate.dialect.MySQLDialect |
11 | Oracle (any version) org.hibernate.dialect.OracleDialect |
12 | Oracle 11g org.hibernate.dialect.Oracle10gDialect |
13 | Oracle 10g org.hibernate.dialect.Oracle10gDialect |
14 | Oracle 9i org.hibernate.dialect.Oracle9iDialect |
15 | PostgreSQL org.hibernate.dialect.PostgreSQLDialect |
16 | Progress org.hibernate.dialect.ProgressDialect |
17 | SAP DB org.hibernate.dialect.SAPDBDialect |
18 | Sybase org.hibernate.dialect.SybaseDialect |
19 | Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect |
Bir Oturum, bir veritabanı ile fiziksel bir bağlantı kurmak için kullanılır. Session nesnesi hafiftir ve veritabanıyla her etkileşim gerektiğinde örneklenecek şekilde tasarlanmıştır. Kalıcı nesneler kaydedilir ve bir Session nesnesi aracılığıyla alınır.
Oturum nesneleri uzun süre açık tutulmamalıdır çünkü bunlar genellikle iş parçacığı açısından güvenli değildir ve gerektiğinde yaratılmalı ve yok edilmelidir. Oturumun ana işlevi, eşlenen varlık sınıflarının örnekleri için işlemler sunmak, oluşturmak, okumak ve silmektir.
Örnekler, belirli bir zamanda aşağıdaki üç durumdan birinde mevcut olabilir -
transient - Bir Oturum ile ilişkili olmayan ve veritabanında temsili olmayan ve hiçbir tanımlayıcı değeri Hibernate tarafından geçici olarak değerlendirilen kalıcı bir sınıfın yeni bir örneği.
persistent- Geçici bir vakayı bir Oturum ile ilişkilendirerek kalıcı hale getirebilirsiniz. Kalıcı bir örnek, veritabanında bir gösterime, bir tanımlayıcı değerine sahiptir ve bir Oturum ile ilişkilendirilmiştir.
detached - Hazırda Bekletme Oturumunu kapattığımızda, kalıcı örnek ayrı bir örnek haline gelecektir.
Bir Oturum örneği, kalıcı sınıfları serileştirilebilirse serileştirilebilir. Tipik bir işlem şu deyimi kullanmalıdır -
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
// do some work
...
tx.commit();
}
catch (Exception e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
Oturum bir istisna atarsa, işlem geri alınmalı ve oturum iptal edilmelidir.
Oturum Arayüz Yöntemleri
Tarafından sağlanan birkaç yöntem vardır. Sessionarayüz, ancak sadece bu eğitimde kullanacağımız birkaç önemli yöntemi listeleyeceğim. İle ilişkili yöntemlerin tam listesi için Hazırda Bekletme belgelerine bakabilirsiniz.Session ve SessionFactory.
Sr.No. | Oturum Yöntemleri ve Açıklama |
---|---|
1 | Transaction beginTransaction() Bir iş birimine başlayın ve ilişkili İşlem nesnesini iade edin. |
2 | void cancelQuery() Mevcut sorgunun yürütülmesini iptal edin. |
3 | void clear() Seansı tamamen temizleyin. |
4 | Connection close() JDBC bağlantısını bırakıp temizleyerek oturumu sonlandırın. |
5 | Criteria createCriteria(Class persistentClass) Verilen varlık sınıfı için yeni bir Ölçüt örneği veya bir varlık sınıfının bir üst sınıfı oluşturun. |
6 | Criteria createCriteria(String entityName) Verilen varlık adı için yeni bir Ölçüt örneği oluşturun. |
7 | Serializable getIdentifier(Object object) Bu oturumla ilişkili olarak verilen varlığın tanımlayıcı değerini döndür. |
8 | Query createFilter(Object collection, String queryString) Verilen koleksiyon ve filtre dizesi için yeni bir Query örneği oluşturun. |
9 | Query createQuery(String queryString) Verilen HQL sorgu dizesi için yeni bir Sorgu örneği oluşturun. |
10 | SQLQuery createSQLQuery(String queryString) Verilen SQL sorgu dizesi için yeni bir SQLQuery örneği oluşturun. |
11 | void delete(Object object) Kalıcı bir örneği veri deposundan kaldırın. |
12 | void delete(String entityName, Object object) Kalıcı bir örneği veri deposundan kaldırın. |
13 | Session get(String entityName, Serializable id) Verilen tanımlayıcı ile verilen adlandırılmış varlığın kalıcı örneğini döndür veya böyle kalıcı bir örnek yoksa null. |
14 | SessionFactory getSessionFactory() Bu oturumu oluşturan oturum fabrikasını alın. |
15 | void refresh(Object object) Verilen örneğin durumunu temel alınan veritabanından yeniden okuyun. |
16 | Transaction getTransaction() Bu oturumla ilişkili İşlem örneğini alın. |
17 | boolean isConnected() Oturumun şu anda bağlı olup olmadığını kontrol edin. |
18 | boolean isDirty() Bu oturum, veritabanı ile senkronize edilmesi gereken herhangi bir değişiklik içeriyor mu? |
19 | boolean isOpen() Oturumun hala açık olup olmadığını kontrol edin. |
20 | Serializable save(Object object) Verilen geçici vakayı devam ettirin, önce oluşturulan bir tanımlayıcı atayın. |
21 | void saveOrUpdate(Object object) Verilen örneği kaydedin (Nesne) veya güncelleyin (Nesne). |
22 | void update(Object object) Kalıcı örneği, verilen bağımsız örneğin tanımlayıcısıyla güncelleyin. |
23 | void update(String entityName, Object object) Kalıcı örneği, verilen bağımsız örneğin tanımlayıcısıyla güncelleyin. |
Hibernate'in tüm konsepti, Java sınıfı özniteliklerinden değerleri alıp bir veritabanı tablosunda saklamaktır. Bir eşleme belgesi, Hibernate'in değerleri sınıflardan nasıl çekeceğini ve tablo ve ilişkili alanlarla nasıl eşleyeceğini belirlemesine yardımcı olur.
Nesneleri veya örnekleri veritabanı tablolarında depolanacak olan Java sınıfları, Hazırda Bekletme'de kalıcı sınıflar olarak adlandırılır. Hazırda bekletme, bu sınıflar olarak da bilinen bazı basit kuralları izlerse en iyi şekilde çalışır.Plain Old Java Object (POJO) programlama modeli.
Kalıcı sınıfların aşağıdaki ana kuralları vardır, ancak bu kuralların hiçbiri zor gereklilikler değildir -
Kalıcı olacak tüm Java sınıfları varsayılan bir kurucuya ihtiyaç duyar.
Nesnelerinizin Hazırda Bekletme ve veri tabanında kolayca tanımlanmasını sağlamak için tüm sınıflar bir kimlik içermelidir. Bu özellik, bir veritabanı tablosunun birincil anahtar sütunuyla eşleşir.
Kalıcı olacak tüm öznitelikler özel olarak beyan edilmeli ve getXXX ve setXXX JavaBean stilinde tanımlanan yöntemler.
Hibernate'in merkezi bir özelliği olan proxy'ler, kalıcı sınıfın nihai olmamasına veya tüm genel yöntemleri bildiren bir arabirimin uygulanmasına bağlıdır.
EJB çerçevesinin gerektirdiği bazı özel sınıfları ve arabirimleri genişletmeyen veya uygulamayan tüm sınıflar.
POJO adı, belirli bir nesnenin sıradan bir Java Nesnesi olduğunu, özel bir nesne olmadığını ve özellikle bir Kurumsal JavaBean olmadığını vurgulamak için kullanılır.
Basit POJO Örneği
Yukarıda belirtilen birkaç kurala dayanarak, bir POJO sınıfını aşağıdaki gibi tanımlayabiliriz -
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Bir nesne / ilişkisel eşlemeler genellikle bir XML belgesinde tanımlanır. Bu eşleme dosyası Hibernate - tanımlı sınıf veya sınıfları veritabanı tablolarına nasıl eşlerim?
Pek çok Hazırda Bekletme kullanıcısı XML'i elle yazmayı seçse de, eşleme belgesini oluşturmak için bir dizi araç mevcuttur. Bunlar arasındaXDoclet, Middlegen ve AndroMDA gelişmiş Hazırda Bekletme kullanıcıları için.
Nesneleri bir sonraki bölümde tanımlanan tabloda yer alacak olan önceden tanımlanmış POJO sınıfımızı ele alalım.
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Kalıcılık sağlamak istediğiniz her nesneye karşılık gelen bir tablo olacaktır. Yukarıdaki nesnelerin aşağıdaki RDBMS tablosunda depolanması ve geri alınması gerektiğini düşünün -
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Yukarıdaki iki varlığa dayanarak, Hibernate'e tanımlanan sınıfı veya sınıfları veritabanı tablolarına nasıl eşleyeceğini bildiren aşağıdaki eşleme dosyasını tanımlayabiliriz.
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name = "Employee" table = "EMPLOYEE">
<meta attribute = "class-description">
This class contains the employee detail.
</meta>
<id name = "id" type = "int" column = "id">
<generator class="native"/>
</id>
<property name = "firstName" column = "first_name" type = "string"/>
<property name = "lastName" column = "last_name" type = "string"/>
<property name = "salary" column = "salary" type = "int"/>
</class>
</hibernate-mapping>
Eşleme belgesini <sınıfadı> .hbm.xml biçiminde bir dosyaya kaydetmelisiniz. Eşleme belgemizi Employee.hbm.xml dosyasına kaydettik.
Eşleme dosyasında kullanılan eşleme öğeleri hakkında biraz ayrıntıyı anlayalım -
Eşleştirme belgesi, aşağıdakilere sahip bir XML belgesidir: <hibernate-mapping> kök öğe olarak, tüm <class> elementler.
<class>öğeleri, bir Java sınıfından veritabanı tablolarına belirli eşlemeleri tanımlamak için kullanılır. Java sınıf adı,name sınıf öğesinin ve veritabanının özniteliği table name, tablo özelliği kullanılarak belirtilir.
<meta> öğesi isteğe bağlı bir öğedir ve sınıf açıklamasını oluşturmak için kullanılabilir.
<id>öğesi, sınıftaki benzersiz kimlik özniteliğini veritabanı tablosunun birincil anahtarıyla eşler. name id öğesinin özniteliği, sınıftaki özelliğe ve columnözellik, veritabanı tablosundaki sütunu ifade eder. type özniteliği hazırda bekletme eşleme türünü tutar, bu eşleme türleri Java'dan SQL veri türüne dönüştürülür.
<generator>id öğesi içindeki öğe, birincil anahtar değerlerini otomatik olarak oluşturmak için kullanılır. class jeneratör elemanının özniteliği şu şekilde ayarlanır: native hazırda bekletmenin ikisini de açmasına izin vermek için identity, sequenceveya hilo temel veritabanının yeteneklerine bağlı olarak birincil anahtar oluşturmak için algoritma.
<property>öğesi, bir Java sınıfı özelliğini veritabanı tablosundaki bir sütuna eşlemek için kullanılır. name öğenin özniteliği sınıftaki özelliğe atıfta bulunur ve columnözellik, veritabanı tablosundaki sütunu ifade eder. type özniteliği hazırda bekletme eşleme türünü tutar, bu eşleme türleri Java'dan SQL veri türüne dönüştürülür.
Bir eşleme belgesinde kullanılacak olan başka nitelikler ve öğeler de vardır ve diğer Hazırda Bekletme ile ilgili konuları tartışırken olabildiğince fazlasını ele almaya çalışacağım.
Bir Hazırda Bekletme eşleme belgesi hazırladığınızda, Java veri türlerini RDBMS veri türlerine eşlediğinizi görürsünüz. typeseşleme dosyalarında bildirilen ve kullanılan Java veri türleri değildir; onlar da SQL veritabanı türleri değildir. Bu türler denirHibernate mapping types, Java'dan SQL veri türlerine ve tersi yönde çeviri yapabilir.
Bu bölüm tüm temel, tarih ve saat, büyük nesne ve çeşitli diğer yerleşik eşleme türlerini listeler.
İlkel Türler
Eşleme türü | Java türü | ANSI SQL Türü |
---|---|---|
tamsayı | int veya java.lang.Integer | TAM |
uzun | long veya java.lang.Long | BÜYÜK |
kısa | kısa veya java.lang.Short | SMALLINT |
yüzen | float veya java.lang.Float | YÜZER |
çift | double veya java.lang.Double | ÇİFT |
büyük_desimal | java.math.BigDecimal | SAYISAL |
karakter | java.lang.String | CHAR (1) |
dizi | java.lang.String | VARCHAR |
bayt | bayt veya java.lang.Byte | TINYINT |
Boole | boolean veya java.lang.Boolean | BİT |
Evet Hayır | boolean veya java.lang.Boolean | CHAR (1) ('Y' veya 'N') |
doğru yanlış | boolean veya java.lang.Boolean | CHAR (1) ['T' veya 'F') |
Tarih ve Saat Türleri
Eşleme türü | Java türü | ANSI SQL Türü |
---|---|---|
tarih | java.util.Date veya java.sql.Date | TARİH |
zaman | java.util.Date veya java.sql.Time | ZAMAN |
zaman damgası | java.util.Date veya java.sql.Timestamp | TIMESTAMP |
takvim | java.util.Calendar | TIMESTAMP |
calendar_date | java.util.Calendar | TARİH |
İkili ve Büyük Nesne Türleri
Eşleme türü | Java türü | ANSI SQL Türü |
---|---|---|
ikili | bayt[] | VARBINARY (veya BLOB) |
Metin | java.lang.String | CLOB |
serileştirilebilir | java.io.Serializable uygulayan herhangi bir Java sınıfı | VARBINARY (veya BLOB) |
tıkanmak | java.sql.Clob | CLOB |
damla | java.sql.Blob | BLOB |
JDK ile ilgili Türler
Eşleme türü | Java türü | ANSI SQL Türü |
---|---|---|
sınıf | java.lang.Class | VARCHAR |
yerel ayar | java.util.Locale | VARCHAR |
saat dilimi | java.util.TimeZone | VARCHAR |
para birimi | java.util.Currency | VARCHAR |
Şimdi, bağımsız bir uygulamada Java kalıcılığı sağlamak için Hibernate'i nasıl kullanabileceğimizi anlamak için bir örnek alalım. Hibernate teknolojisini kullanarak bir Java Uygulaması oluşturmanın farklı adımlarından geçeceğiz.
POJO Sınıfları Oluşturun
Bir uygulama oluşturmanın ilk adımı, veritabanında kalıcı olacak uygulamaya bağlı olarak Java POJO sınıfını veya sınıflarını oluşturmaktır. Düşünelim bizimEmployee ile sınıf getXXX ve setXXX JavaBeans uyumlu sınıf yapma yöntemleri.
POJO (Düz Eski Java Nesnesi), sırasıyla EJB çerçevesinin gerektirdiği bazı özel sınıfları ve arayüzleri genişletmeyen veya uygulamayan bir Java nesnesidir. Tüm normal Java nesneleri POJO'dur.
Hibernate tarafından kalıcı olacak bir sınıf tasarladığınızda, JavaBeans uyumlu kodun yanı sıra indeks olarak çalışacak bir özellik sağlamak önemlidir. id Employee sınıfındaki öznitelik.
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Veritabanı Tabloları Oluşturun
İkinci adım, veritabanınızda tablolar oluşturmak olacaktır. Her nesneye karşılık gelen bir tablo olacaktır, kalıcılık sağlamaya istekli olursunuz. Yukarıdaki nesnelerin aşağıdaki RDBMS tablosunda depolanması ve geri alınması gerektiğini düşünün -
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Eşleme Yapılandırma Dosyası Oluşturun
Bu adım, Hibernate'e tanımlanan sınıfı veya sınıfları veritabanı tablolarıyla nasıl eşleştireceğini bildiren bir eşleme dosyası oluşturmaktır.
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name = "Employee" table = "EMPLOYEE">
<meta attribute = "class-description">
This class contains the employee detail.
</meta>
<id name = "id" type = "int" column = "id">
<generator class="native"/>
</id>
<property name = "firstName" column = "first_name" type = "string"/>
<property name = "lastName" column = "last_name" type = "string"/>
<property name = "salary" column = "salary" type = "int"/>
</class>
</hibernate-mapping>
Eşleme belgesini <sınıfadı> .hbm.xml biçiminde bir dosyaya kaydetmelisiniz. Eşleme belgemizi Employee.hbm.xml dosyasına kaydettik. Haritalama belgesi hakkında çok az ayrıntı görelim -
Eşleme belgesi, tüm <class> öğelerini içeren kök öğe olarak <hibernate-mapping> içeren bir XML belgesidir.
<class>öğeleri, bir Java sınıfından veritabanı tablolarına belirli eşlemeleri tanımlamak için kullanılır. Java sınıf adı,name sınıf öğesinin özniteliği ve veritabanı tablo adı, table öznitelik.
<meta> öğesi isteğe bağlı bir öğedir ve sınıf açıklamasını oluşturmak için kullanılabilir.
<id>öğesi, sınıftaki benzersiz kimlik özniteliğini veritabanı tablosunun birincil anahtarıyla eşler. name id öğesinin özniteliği, sınıftaki özelliğe ve columnözellik, veritabanı tablosundaki sütunu ifade eder. type özniteliği hazırda bekletme eşleme türünü tutar, bu eşleme türleri Java'dan SQL veri türüne dönüştürülür.
<generator>id öğesi içindeki öğe, birincil anahtar değerlerini otomatik olarak oluşturmak için kullanılır. class jeneratör elemanının özniteliği şu şekilde ayarlanır: native hazırda bekletmenin ikisini de açmasına izin vermek için identity, sequence veya hilo temel veritabanının yeteneklerine bağlı olarak birincil anahtar oluşturmak için algoritma.
<property>öğesi, bir Java sınıfı özelliğini veritabanı tablosundaki bir sütuna eşlemek için kullanılır. name öğenin özniteliği sınıftaki özelliğe atıfta bulunur ve columnözellik, veritabanı tablosundaki sütunu ifade eder. type özniteliği hazırda bekletme eşleme türünü tutar, bu eşleme türleri Java'dan SQL veri türüne dönüştürülür.
Bir eşleme belgesinde kullanılacak olan başka nitelikler ve öğeler de vardır ve diğer Hazırda Bekletme ile ilgili konuları tartışırken olabildiğince fazlasını ele almaya çalışacağım.
Uygulama Sınıfı Oluşturun
Son olarak, uygulamayı çalıştırmak için main () yöntemi ile uygulama sınıfımızı oluşturacağız. Bu uygulamayı birkaç Çalışan kaydını kaydetmek için kullanacağız ve ardından bu kayıtlara CRUD işlemlerini uygulayacağız.
import java.util.List;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try {
factory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Add few employee records in database */
Integer empID1 = ME.addEmployee("Zara", "Ali", 1000);
Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
Integer empID3 = ME.addEmployee("John", "Paul", 10000);
/* List down all the employees */
ME.listEmployees();
/* Update employee's records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down new list of the employees */
ME.listEmployees();
}
/* Method to CREATE an employee in the database */
public Integer addEmployee(String fname, String lname, int salary){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try {
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employeeID = (Integer) session.save(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
return employeeID;
}
/* Method to READ all the employees */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator = employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
}
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
/* Method to UPDATE salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Employee employee = (Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
/* Method to DELETE an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Employee employee = (Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
}
Derleme ve Yürütme
Yukarıda belirtilen uygulamayı derleme ve çalıştırma adımları aşağıda verilmiştir. Derleme ve yürütme için ilerlemeden önce PATH ve CLASSPATH'ı uygun şekilde ayarladığınızdan emin olun.
Yapılandırma bölümünde açıklandığı gibi hibernate.cfg.xml yapılandırma dosyasını oluşturun.
Employee.hbm.xml eşleme dosyasını yukarıda gösterildiği gibi oluşturun.
Employee.java kaynak dosyasını yukarıda gösterildiği gibi oluşturun ve derleyin.
ManageEmployee.java kaynak dosyasını yukarıda gösterildiği gibi oluşturun ve derleyin.
Programı çalıştırmak için ManageEmployee ikili dosyasını çalıştırın.
Aşağıdaki sonucu alırsınız ve kayıtlar EMPLOYEE tablosunda oluşturulur.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Zara Last Name: Ali Salary: 1000
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 10000
First Name: Zara Last Name: Ali Salary: 5000
First Name: John Last Name: Paul Salary: 10000
EMPLOYEE tablonuzu kontrol ederseniz, aşağıdaki kayıtlara sahip olmalıdır -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 29 | Zara | Ali | 5000 |
| 31 | John | Paul | 10000 |
+----+------------+-----------+--------+
2 rows in set (0.00 sec
mysql>
Şimdiye kadar, hazırda bekletme kullanarak çok temel O / R haritalama gördük, ancak ayrıntılı olarak öğrenmemiz gereken en önemli üç haritalama konusu var.
Bunlar -
- Koleksiyonların haritalanması,
- Varlık sınıfları arasındaki ilişkilerin eşlenmesi ve
- Bileşen Eşlemeleri.
Koleksiyon Eşlemeleri
Bir varlık veya sınıf, belirli bir değişken için değer koleksiyonuna sahipse, bu değerleri java'da bulunan koleksiyon arayüzlerinden herhangi birini kullanarak eşleyebiliriz. Hazırda bekletme,java.util.Map, java.util.Set, java.util.SortedMap, java.util.SortedSet, java.util.List, Ve herhangi biri array kalıcı varlıkların veya değerlerin.
Sr.No. | Koleksiyon türü ve Eşleme Açıklaması |
---|---|
1 | java.util.Set Bu bir <set> öğesi ile eşlenir ve java.util.HashSet ile başlatılır |
2 | java.util.SortedSet Bu bir <set> öğesi ile eşlenir ve java.util.TreeSet ile başlatılır. sort özellik, bir karşılaştırıcıya veya doğal sıralamaya ayarlanabilir. |
3 | java.util.List Bu bir <list> öğesi ile eşlenir ve java.util.ArrayList ile başlatılır |
4 | java.util.Collection Bu bir <bag> veya <ibag> öğesi ile eşlenir ve java.util.ArrayList ile başlatılır |
5 | java.util.Map Bu bir <map> öğesi ile eşlenir ve java.util.HashMap ile başlatılır. |
6 | java.util.SortedMap Bu bir <map> öğesi ile eşleştirilir ve java.util.TreeMap ile başlatılır. sort özellik, bir karşılaştırıcıya veya doğal sıralamaya ayarlanabilir. |
Diziler, Java ilkel değer türleri için <birincil-dizi> ve diğer her şey için <dizi> ile Hazırda Bekletme tarafından desteklenir. Ancak, nadiren kullanılırlar, bu yüzden onları bu eğitimde tartışmayacağım.
Hibernate tarafından doğrudan desteklenmeyen, kullanıcı tanımlı bir koleksiyon arayüzlerini haritalamak istiyorsanız, Hibernate'e özel koleksiyonlarınızın anlamlarını anlatmanız gerekir ki bu çok kolay değildir ve kullanılması tavsiye edilmez.
İlişkilendirme Eşlemeleri
Varlık sınıfları arasındaki ilişkilerin ve tablolar arasındaki ilişkilerin eşlenmesi, ORM'nin özüdür. Aşağıda, nesneler arasındaki ilişkinin esas niteliğinin ifade edilebileceği dört yol vardır. Bir ilişki eşlemesi tek yönlü olabileceği gibi çift yönlü de olabilir.
Sr.No. | Eşleme türü ve açıklaması |
---|---|
1 | Çoktan bire Hazırda Bekletme'yi kullanarak çoktan bire ilişkiyi eşleme |
2 | Bire bir Hazırda Bekletme'yi kullanarak bire bir ilişkiyi eşleme |
3 | Bire Çok Hazırda Bekletme'yi kullanarak bire çok ilişkisini eşleme |
4 | Çoktan Çoğa Hazırda Bekletme'yi kullanarak çoktan çoğa ilişkisini eşleme |
Bileşen Eşlemeleri
Bir Varlık sınıfının, üye değişken olarak başka bir sınıfa başvurması çok olasıdır. Bahsedilen sınıfın kendi yaşam döngüsü yoksa ve tamamen sahip olan varlık sınıfının yaşam döngüsüne bağlıysa, o zaman atıfta bulunulan sınıfa bu nedenle denirComponent class.
Collection of Components'ın eşlenmesi, normal Koleksiyonların küçük konfigürasyon farklılıklarıyla eşleştirilmesi gibi benzer bir şekilde mümkündür. Bu iki eşlemeyi örneklerle detaylı olarak göreceğiz.
Sr.No. | Eşleme türü ve açıklaması |
---|---|
1 | Bileşen Eşlemeleri Üye değişken olarak başka bir sınıfa başvuru içeren bir sınıf için eşleme. |
Şimdiye kadar Hibernate'in verilerin POJO'dan veritabanı tablolarına ve tersi yönde dönüştürülmesi için XML eşleme dosyasını nasıl kullandığını gördünüz. Hazırda bekletme ek açıklamaları, eşlemeleri XML dosyası kullanmadan tanımlamanın en yeni yoludur. Ek açıklamaları, XML eşleme meta verilerine ek olarak veya bunların yerine kullanabilirsiniz.
Hazırda Bekletme Ek Açıklamaları, Nesne ve İlişkisel Tablo eşlemesi için meta verileri sağlamanın güçlü bir yoludur. Tüm meta veriler, kodla birlikte POJO java dosyasına eklenir, bu, kullanıcının geliştirme sırasında tablo yapısını ve POJO'yu aynı anda anlamasına yardımcı olur.
Uygulamanızı diğer EJB 3 uyumlu ORM uygulamalarına taşınabilir hale getirecekseniz, eşleme bilgilerini temsil etmek için ek açıklamalar kullanmanız gerekir, ancak yine de daha fazla esneklik istiyorsanız, XML tabanlı eşleştirmelerle devam etmelisiniz.
Hazırda Bekletme Notu için Ortam Kurulumu
Öncelikle, JDK 5.0 kullandığınızdan emin olmanız gerekir, aksi takdirde ek açıklamalar için yerel destekten yararlanmak için JDK'nızı JDK 5.0'a yükseltmeniz gerekir.
İkinci olarak, sourceforge'da bulunan Hibernate 3.x ek açıklamalar dağıtım paketini yüklemeniz gerekir: ( Hazırda Bekletme Ek Açıklamasını İndirin ) ve kopyalayınhibernate-annotations.jar, lib/hibernate-comons-annotations.jar ve lib/ejb3-persistence.jar Hazırda Bekletme Ek Açıklamaları dağıtımından CLASSPATH'ınıza.
Açıklamalı Sınıf Örneği
Yukarıda Hibernate Annotation ile çalışırken bahsettiğim gibi, tüm meta veriler kodla birlikte POJO java dosyasına toplanır, bu, kullanıcının geliştirme sırasında tablo yapısını ve POJO'yu aynı anda anlamasına yardımcı olur.
Nesnelerimizi saklamak için aşağıdaki EMPLOYEE tablosunu kullanacağımızı düşünün -
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Aşağıda, tanımlanmış EMPLOYEE tablosu ile nesneleri eşlemek için ek açıklamalarla Çalışan sınıfının eşlenmesi verilmiştir -
import javax.persistence.*;
@Entity
@Table(name = "EMPLOYEE")
public class Employee {
@Id @GeneratedValue
@Column(name = "id")
private int id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "salary")
private int salary;
public Employee() {}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Hazırda bekletme, @Id açıklamasının bir alanda olduğunu algılar ve bir nesnenin özelliklerine çalışma zamanında alanlar aracılığıyla doğrudan erişmesi gerektiğini varsayar. @Id ek açıklamasını getId () yöntemine yerleştirdiyseniz, varsayılan olarak alıcı ve ayarlayıcı yöntemleri aracılığıyla özelliklere erişimi etkinleştirirsiniz. Bu nedenle, diğer tüm açıklamalar da seçilen stratejiyi izleyerek alanlara veya alıcı yöntemlere yerleştirilir.
Aşağıdaki bölüm, yukarıdaki sınıfta kullanılan ek açıklamaları açıklayacaktır.
@Entity Ek Açıklama
EJB 3 standart ek açıklamaları, javax.persistencepaketi, bu yüzden bu paketi ilk adım olarak içe aktarıyoruz. İkincisi, kullandık@Entity Bu sınıfı bir varlık çekirdeği olarak işaretleyen Employee sınıfına ek açıklama, bu nedenle en azından korumalı kapsamla görülebilen bağımsız değişken içermeyen bir kurucuya sahip olmalıdır.
@ Tablo Ek Açıklama
@Table ek açıklaması, varlığı veritabanında sürdürmek için kullanılacak tablonun ayrıntılarını belirlemenize olanak tanır.
@Table ek açıklaması, tablonun adını, kataloğunu ve şemasını geçersiz kılmanıza ve tablodaki sütunlarda benzersiz kısıtlamalar uygulamanıza olanak tanıyan dört özellik sağlar. Şimdilik sadece EMPLOYEE olan tablo adını kullanıyoruz.
@Id ve @GeneratedValue Ek Açıklamaları
Her varlık çekirdeği, sınıfa ek olarak not eklediğiniz bir birincil anahtara sahip olacaktır. @Idek açıklama. Birincil anahtar, tablo yapınıza bağlı olarak tek bir alan veya birden çok alanın bir kombinasyonu olabilir.
Varsayılan olarak, @Id ek açıklaması kullanılacak en uygun birincil anahtar oluşturma stratejisini otomatik olarak belirleyecektir, ancak bunu uygulayarak geçersiz kılabilirsiniz. @GeneratedValue iki parametre alan açıklama strategy ve generatorBurada tartışmayacağım, bu yüzden sadece varsayılan anahtar oluşturma stratejisini kullanalım. Hazırda Bekletme'nin hangi jeneratör türünün kullanılacağını belirlemesine izin vermek, kodunuzu farklı veritabanları arasında taşınabilir hale getirir.
@ Sütun Ek Açıklaması
@Column ek açıklaması, bir alanın veya özelliğin eşleneceği sütunun ayrıntılarını belirtmek için kullanılır. Aşağıdaki en yaygın kullanılan özniteliklerle sütun açıklamasını kullanabilirsiniz -
name öznitelik, sütun adının açıkça belirtilmesine izin verir.
length özniteliği, özellikle bir String değeri için bir değeri eşlemek için kullanılan sütunun boyutuna izin verir.
nullable özniteliği, şema oluşturulduğunda sütunun NOT NULL olarak işaretlenmesine izin verir.
unique özellik, sütunun yalnızca benzersiz değerler içerecek şekilde işaretlenmesine izin verir.
Uygulama Sınıfı Oluşturun
Son olarak, uygulamayı çalıştırmak için main () yöntemi ile uygulama sınıfımızı oluşturacağız. Bu uygulamayı birkaç Çalışan kaydını kaydetmek için kullanacağız ve ardından bu kayıtlara CRUD işlemlerini uygulayacağız.
import java.util.List;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try {
factory = new AnnotationConfiguration().
configure().
//addPackage("com.xyz") //add package if used.
addAnnotatedClass(Employee.class).
buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Add few employee records in database */
Integer empID1 = ME.addEmployee("Zara", "Ali", 1000);
Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
Integer empID3 = ME.addEmployee("John", "Paul", 10000);
/* List down all the employees */
ME.listEmployees();
/* Update employee's records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down new list of the employees */
ME.listEmployees();
}
/* Method to CREATE an employee in the database */
public Integer addEmployee(String fname, String lname, int salary){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try {
tx = session.beginTransaction();
Employee employee = new Employee();
employee.setFirstName(fname);
employee.setLastName(lname);
employee.setSalary(salary);
employeeID = (Integer) session.save(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
return employeeID;
}
/* Method to READ all the employees */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator = employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
}
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
/* Method to UPDATE salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Employee employee = (Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
/* Method to DELETE an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Employee employee = (Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
}
Veritabanı Yapılandırması
Şimdi yaratalım hibernate.cfg.xml veritabanıyla ilgili parametreleri tanımlamak için yapılandırma dosyası.
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name = "hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name = "hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- Assume students is the database name -->
<property name = "hibernate.connection.url">
jdbc:mysql://localhost/test
</property>
<property name = "hibernate.connection.username">
root
</property>
<property name = "hibernate.connection.password">
cohondob
</property>
</session-factory>
</hibernate-configuration>
Derleme ve Yürütme
Yukarıda belirtilen uygulamayı derleme ve çalıştırma adımları aşağıda verilmiştir. Derleme ve yürütme için ilerlemeden önce PATH ve CLASSPATH'ı uygun şekilde ayarladığınızdan emin olun.
Employee.hbm.xml eşleme dosyasını yoldan silin.
Employee.java kaynak dosyasını yukarıda gösterildiği gibi oluşturun ve derleyin.
ManageEmployee.java kaynak dosyasını yukarıda gösterildiği gibi oluşturun ve derleyin.
Programı çalıştırmak için ManageEmployee ikili dosyasını çalıştırın.
Aşağıdaki sonucu alırsınız ve kayıtlar EMPLOYEE tablosunda oluşturulur.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Zara Last Name: Ali Salary: 1000
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 10000
First Name: Zara Last Name: Ali Salary: 5000
First Name: John Last Name: Paul Salary: 10000
EMPLOYEE tablonuzu kontrol ederseniz, aşağıdaki kayıtlara sahip olmalıdır -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 29 | Zara | Ali | 5000 |
| 31 | John | Paul | 10000 |
+----+------------+-----------+--------+
2 rows in set (0.00 sec
mysql>
Hazırda Bekletme Sorgu Dili (HQL), SQL'e benzer nesne yönelimli bir sorgu dilidir, ancak tablolar ve sütunlar üzerinde çalışmak yerine, HQL kalıcı nesneler ve bunların özellikleriyle çalışır. HQL sorguları Hibernate tarafından geleneksel SQL sorgularına çevrilir ve bu da veritabanı üzerinde eylem gerçekleştirir.
Native SQL kullanarak SQL deyimlerini doğrudan Hibernate ile kullanabilirsiniz, ancak veritabanı taşınabilirliği sorunlarından kaçınmak ve Hibernate'in SQL oluşturma ve önbelleğe alma stratejilerinden yararlanmak için mümkün olduğunda HQL kullanmanızı öneririm.
SELECT, FROM ve WHERE, vb. Gibi anahtar sözcükler büyük / küçük harfe duyarlı değildir, ancak tablo ve sütun adları gibi özellikler HQL'de büyük / küçük harfe duyarlıdır.
MADDE
Kullanacaksın FROMtam bir kalıcı nesneyi belleğe yüklemek istiyorsanız yan tümcesi. FROM yan tümcesini kullanmanın basit sözdizimi aşağıdadır -
String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();
HQL'de bir sınıf adını tam olarak nitelendirmeniz gerekiyorsa, yalnızca paketi ve sınıf adını aşağıdaki gibi belirtin -
String hql = "FROM com.hibernatebook.criteria.Employee";
Query query = session.createQuery(hql);
List results = query.list();
AS Madde
AScümlesi, özellikle uzun sorgularınız olduğunda, HQL sorgularınızdaki sınıflara takma adlar atamak için kullanılabilir. Örneğin, önceki basit örneğimiz aşağıdaki gibi olacaktır -
String hql = "FROM Employee AS E";
Query query = session.createQuery(hql);
List results = query.list();
AS anahtar kelime isteğe bağlıdır ve takma adı sınıf adının hemen ardından aşağıdaki gibi de belirtebilirsiniz -
String hql = "FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
SELECT Fıkra
SELECTyan tümce, sonuç kümesi üzerinde daha fazla kontrol sağlar, daha sonra from yan tümcesi. Tüm nesne yerine nesnelerin birkaç özelliğini elde etmek istiyorsanız, SELECT yan tümcesini kullanın. Aşağıda, Employee nesnesinin yalnızca ilk_adı alanını elde etmek için SELECT yan tümcesini kullanmanın basit sözdizimi verilmiştir -
String hql = "SELECT E.firstName FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
Burada dikkate değer Employee.firstName EMPLOYEE tablosunun bir alanı değil, Employee nesnesinin bir özelliğidir.
NEREDE Fıkra
Depodan döndürülen belirli nesneleri daraltmak istiyorsanız, WHERE yan tümcesini kullanırsınız. WHERE yan tümcesini kullanmanın basit sözdizimi aşağıdadır -
String hql = "FROM Employee E WHERE E.id = 10";
Query query = session.createQuery(hql);
List results = query.list();
Maddeye Göre SİPARİŞ
HQL sorgunuzun sonuçlarını sıralamak için, ORDER BYfıkra. Sonuçları, sonuç kümesindeki nesnelerdeki herhangi bir özelliğe göre artan (ASC) veya azalan (DESC) sıralayabilirsiniz. ORDER BY yan tümcesini kullanmanın basit sözdizimi aşağıdadır -
String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();
Birden fazla özelliğe göre sıralamak istiyorsanız, ek özellikleri sıranın sonuna virgülle ayırarak aşağıdaki gibi eklemeniz yeterlidir -
String hql = "FROM Employee E WHERE E.id > 10 " +
"ORDER BY E.firstName DESC, E.salary DESC ";
Query query = session.createQuery(hql);
List results = query.list();
GRUPLAMA MADDESİ
Bu madde, Hibernate'in veritabanından bilgileri çekmesine ve bunu bir özniteliğin değerine göre gruplandırmasına ve tipik olarak sonucu bir toplu değer eklemek için kullanmasına izin verir. Aşağıda, GROUP BY yan tümcesini kullanmanın basit sözdizimi verilmiştir -
String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
"GROUP BY E.firstName";
Query query = session.createQuery(hql);
List results = query.list();
Adlandırılmış Parametreleri Kullanma
Hibernate, HQL sorgularında adlandırılmış parametreleri destekler. Bu, kullanıcıdan girdi kabul eden HQL sorguları yazmayı kolaylaştırır ve SQL enjeksiyon saldırılarına karşı savunmanız gerekmez. Aşağıda adlandırılmış parametreleri kullanmanın basit sözdizimi verilmiştir -
String hql = "FROM Employee E WHERE E.id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id",10);
List results = query.list();
GÜNCELLEME Maddesi
Toplu güncellemeler, Hibernate 3 ile HQL için yenidir ve işi, Hazırda Bekletme 2'de olduğundan farklı bir şekilde Hazırda Bekletme 3'te silinir. Sorgu arabirimi, artık HQL UPDATE veya DELETE komutlarını yürütmek için executeUpdate () adlı bir yöntem içerir.
UPDATEcümlesi, bir veya daha fazla nesnenin bir veya daha fazla özelliğini güncellemek için kullanılabilir. UPDATE yan tümcesini kullanmanın basit sözdizimi aşağıdadır -
String hql = "UPDATE Employee set salary = :salary " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("salary", 1000);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
DELETE Clause
DELETEcümlesi bir veya daha fazla nesneyi silmek için kullanılabilir. DELETE yan tümcesini kullanmanın basit sözdizimi aşağıdadır -
String hql = "DELETE FROM Employee " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
INSERT Fıkra
HQL destekler INSERT INTOyan tümce, kayıtların bir nesneden başka bir nesneye eklenebildiği durumlarda. INSERT INTO yan tümcesini kullanmanın basit sözdizimi aşağıdadır -
String hql = "INSERT INTO Employee(firstName, lastName, salary)" +
"SELECT firstName, lastName, salary FROM old_employee";
Query query = session.createQuery(hql);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
Toplama Yöntemleri
HQL, SQL'e benzer bir dizi toplama yöntemini destekler. HQL'de SQL'de olduğu gibi çalışırlar ve mevcut fonksiyonların listesi aşağıdadır -
Sr.No. | Fonksiyonlar ve Açıklama |
---|---|
1 | avg(property name) Bir mülkün değerinin ortalaması |
2 | count(property name or *) Sonuçlarda bir özelliğin oluşma sayısı |
3 | max(property name) Mülk değerlerinin maksimum değeri |
4 | min(property name) Özellik değerlerinin minimum değeri |
5 | sum(property name) Mülk değerlerinin toplamı |
distinctanahtar kelime, yalnızca satır kümesindeki benzersiz değerleri sayar. Aşağıdaki sorgu yalnızca benzersiz sayıyı döndürür -
String hql = "SELECT count(distinct E.firstName) FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
Sorgu kullanarak sayfalandırma
Sayfalandırma için Sorgu arayüzünün iki yöntemi vardır.
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | Query setFirstResult(int startPosition) Bu yöntem, 0 satırından başlayarak sonuç kümenizdeki ilk satırı temsil eden bir tamsayı alır. |
2 | Query setMaxResults(int maxResult) Bu yöntem, Hibernate'e sabit bir numarayı almasını söyler maxResults nesnelerin. |
Yukarıdaki iki yöntemi birlikte kullanarak, web veya Swing uygulamamızda bir sayfalama bileşeni oluşturabiliriz. Bir seferde 10 satır getirmek için uzatabileceğiniz örnek aşağıdadır -
String hql = "FROM Employee";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();
Hazırda bekletme, nesneleri ve dolayısıyla RDBMS tablolarında bulunan verileri işlemenin alternatif yollarını sağlar. Yöntemlerden biri, filtreleme kurallarını ve mantıksal koşulları uygulayabileceğiniz programlı olarak bir ölçüt sorgu nesnesi oluşturmanıza olanak tanıyan Ölçüt API'sidir.
Hazırda Bekletme Session arayüz sağlar createCriteria() bir yöntem oluşturmak için kullanılabilecek Criteria uygulamanız bir ölçüt sorgusu yürüttüğünde kalıcılık nesnesi sınıfının örneklerini döndüren nesne.
Aşağıda, bir ölçüt sorgusunun en basit örneği, Employee sınıfına karşılık gelen her nesneyi basitçe döndürecektir.
Criteria cr = session.createCriteria(Employee.class);
List results = cr.list();
Kriterlerle Kısıtlamalar
Kullanabilirsiniz add() için uygun yöntem Criteriaölçüt sorgusu için kısıtlama eklenecek nesne. Aşağıda, maaşı 2000'e eşit olan kayıtları döndürmek için bir kısıtlama ekleme örneği verilmiştir -
Criteria cr = session.createCriteria(Employee.class);
cr.add(Restrictions.eq("salary", 2000));
List results = cr.list();
Aşağıda, farklı senaryoları kapsayan birkaç örnek daha verilmiştir ve ihtiyaca göre kullanılabilir -
Criteria cr = session.createCriteria(Employee.class);
// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));
// To get records having salary less than 2000
cr.add(Restrictions.lt("salary", 2000));
// To get records having fistName starting with zara
cr.add(Restrictions.like("firstName", "zara%"));
// Case sensitive form of the above restriction.
cr.add(Restrictions.ilike("firstName", "zara%"));
// To get records having salary in between 1000 and 2000
cr.add(Restrictions.between("salary", 1000, 2000));
// To check if the given property is null
cr.add(Restrictions.isNull("salary"));
// To check if the given property is not null
cr.add(Restrictions.isNotNull("salary"));
// To check if the given property is empty
cr.add(Restrictions.isEmpty("salary"));
// To check if the given property is not empty
cr.add(Restrictions.isNotEmpty("salary"));
Aşağıdaki gibi LogicalExpression kısıtlamalarını kullanarak VE veya VEYA koşulları oluşturabilirsiniz -
Criteria cr = session.createCriteria(Employee.class);
Criterion salary = Restrictions.gt("salary", 2000);
Criterion name = Restrictions.ilike("firstNname","zara%");
// To get records matching with OR conditions
LogicalExpression orExp = Restrictions.or(salary, name);
cr.add( orExp );
// To get records matching with AND conditions
LogicalExpression andExp = Restrictions.and(salary, name);
cr.add( andExp );
List results = cr.list();
Yukarıdaki tüm koşullar önceki eğitimde açıklandığı gibi doğrudan HQL ile kullanılabilir.
Kriter Kullanarak Sayfalandırma
Sayfalandırma için Ölçüt arayüzünün iki yöntemi vardır.
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public Criteria setFirstResult(int firstResult) Bu yöntem, 0 satırından başlayarak sonuç kümenizdeki ilk satırı temsil eden bir tamsayı alır. |
2 | public Criteria setMaxResults(int maxResults) Bu yöntem, Hibernate'e sabit bir numarayı almasını söyler maxResults nesnelerin. |
Yukarıdaki iki yöntemi birlikte kullanarak, web veya Swing uygulamamızda bir sayfalama bileşeni oluşturabiliriz. Bir seferde 10 satır getirmek için uzatabileceğiniz örnek aşağıdadır -
Criteria cr = session.createCriteria(Employee.class);
cr.setFirstResult(1);
cr.setMaxResults(10);
List results = cr.list();
Sonuçları Sıralama
Criteria API, org.hibernate.criterion.OrderNesnenizin özelliklerinden birine göre sonuç kümenizi artan veya azalan sırada sıralamak için sınıf. Bu örnek, sonuç kümesini sıralamak için Order sınıfını nasıl kullanacağınızı gösterir -
Criteria cr = session.createCriteria(Employee.class);
// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));
// To sort records in descening order
cr.addOrder(Order.desc("salary"));
// To sort records in ascending order
cr.addOrder(Order.asc("salary"));
List results = cr.list();
Projeksiyonlar ve Toplamalar
Criteria API, org.hibernate.criterion.Projectionsözellik değerlerinin ortalamasını, maksimumunu veya minimumunu elde etmek için kullanılabilen sınıf. Projections sınıfı, Restrictions sınıfına benzer, çünkü elde etmek için birkaç statik fabrika yöntemi sağlar.Projection örnekler.
Aşağıda, farklı senaryoları kapsayan birkaç örnek verilmiştir ve ihtiyaca göre kullanılabilir -
Criteria cr = session.createCriteria(Employee.class);
// To get total row count.
cr.setProjection(Projections.rowCount());
// To get average of a property.
cr.setProjection(Projections.avg("salary"));
// To get distinct count of a property.
cr.setProjection(Projections.countDistinct("firstName"));
// To get maximum of a property.
cr.setProjection(Projections.max("salary"));
// To get minimum of a property.
cr.setProjection(Projections.min("salary"));
// To get sum of a property.
cr.setProjection(Projections.sum("salary"));
Ölçüt Sorguları Örneği
Aşağıdaki POJO sınıfını düşünün -
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Çalışan nesnelerini depolamak için aşağıdaki EMPLOYEE tablosunu oluşturalım -
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Eşleme dosyası aşağıda olacaktır.
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name = "Employee" table = "EMPLOYEE">
<meta attribute = "class-description">
This class contains the employee detail.
</meta>
<id name = "id" type = "int" column = "id">
<generator class="native"/>
</id>
<property name = "firstName" column = "first_name" type = "string"/>
<property name = "lastName" column = "last_name" type = "string"/>
<property name = "salary" column = "salary" type = "int"/>
</class>
</hibernate-mapping>
Son olarak, kullanacağımız uygulamayı çalıştırmak için main () yöntemi ile uygulama sınıfımızı oluşturacağız. Criteria sorgular -
import java.util.List;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Projections;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try {
factory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Add few employee records in database */
Integer empID1 = ME.addEmployee("Zara", "Ali", 2000);
Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
Integer empID3 = ME.addEmployee("John", "Paul", 5000);
Integer empID4 = ME.addEmployee("Mohd", "Yasee", 3000);
/* List down all the employees */
ME.listEmployees();
/* Print Total employee's count */
ME.countEmployee();
/* Print Total salary */
ME.totalSalary();
}
/* Method to CREATE an employee in the database */
public Integer addEmployee(String fname, String lname, int salary){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try {
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employeeID = (Integer) session.save(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
return employeeID;
}
/* Method to READ all the employees having salary more than 2000 */
public void listEmployees( ) {
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Criteria cr = session.createCriteria(Employee.class);
// Add restriction.
cr.add(Restrictions.gt("salary", 2000));
List employees = cr.list();
for (Iterator iterator = employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
}
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
/* Method to print total number of records */
public void countEmployee(){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Criteria cr = session.createCriteria(Employee.class);
// To get total row count.
cr.setProjection(Projections.rowCount());
List rowCount = cr.list();
System.out.println("Total Coint: " + rowCount.get(0) );
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
/* Method to print sum of salaries */
public void totalSalary(){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Criteria cr = session.createCriteria(Employee.class);
// To get total salary.
cr.setProjection(Projections.sum("salary"));
List totalSalary = cr.list();
System.out.println("Total Salary: " + totalSalary.get(0) );
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
}
Derleme ve Yürütme
Yukarıda belirtilen uygulamayı derleme ve çalıştırma adımları aşağıda verilmiştir. Derleme ve yürütme için ilerlemeden önce PATH ve CLASSPATH'ı uygun şekilde ayarladığınızdan emin olun.
Yapılandırma bölümünde açıklandığı gibi hibernate.cfg.xml yapılandırma dosyasını oluşturun.
Employee.hbm.xml eşleme dosyasını yukarıda gösterildiği gibi oluşturun.
Employee.java kaynak dosyasını yukarıda gösterildiği gibi oluşturun ve derleyin.
ManageEmployee.java kaynak dosyasını yukarıda gösterildiği gibi oluşturun ve derleyin.
Programı çalıştırmak için ManageEmployee ikili dosyasını çalıştırın.
Aşağıdaki sonucu alırsınız ve kayıtlar EMPLOYEE tablosunda oluşturulur.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 5000
First Name: Mohd Last Name: Yasee Salary: 3000
Total Coint: 4
Total Salary: 15000
EMPLOYEE tablonuzu kontrol ederseniz, aşağıdaki kayıtlara sahip olmalıdır−
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 14 | Zara | Ali | 2000 |
| 15 | Daisy | Das | 5000 |
| 16 | John | Paul | 5000 |
| 17 | Mohd | Yasee | 3000 |
+----+------------+-----------+--------+
4 rows in set (0.00 sec)
mysql>
Oracle'da sorgu ipuçları veya CONNECT anahtar sözcüğü gibi veritabanına özgü özellikleri kullanmak istiyorsanız, veritabanı sorgularını ifade etmek için yerel SQL'i kullanabilirsiniz. Hibernate 3.x, tüm oluşturma, güncelleme, silme ve yükleme işlemleri için saklı prosedürler dahil olmak üzere el yazısı SQL'i belirlemenize olanak tanır.
Uygulamanız ile oturumdan yerel bir SQL sorgusu oluşturacaktır. createSQLQuery() Oturum arayüzünde yöntem -
public SQLQuery createSQLQuery(String sqlString) throws HibernateException
CreateSQLQuery () yöntemine SQL sorgusunu içeren bir dize ilettikten sonra, addEntity (), addJoin () ve addScalar () yöntemlerini kullanarak SQL sonucunu var olan bir Hibernate varlığı, bir birleştirme veya bir skaler sonuçla ilişkilendirebilirsiniz. sırasıyla.
Skaler Sorgular
En temel SQL sorgusu, bir veya daha fazla tablodan skalarların (değerlerin) bir listesini almaktır. Skaler değerler için yerel SQL kullanmak için sözdizimi aşağıdadır -
String sql = "SELECT first_name, salary FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List results = query.list();
Varlık Sorguları
Yukarıdaki sorgular, temelde sonuç kümesinden "ham" değerleri döndürerek, skaler değerleri döndürmekle ilgiliydi. Varlık nesnelerini bir bütün olarak yerel bir sql sorgusundan addEntity () yoluyla almak için sözdizimi aşağıdadır.
String sql = "SELECT * FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
List results = query.list();
Adlandırılmış SQL Sorguları
Aşağıda, addEntity () yoluyla ve adlandırılmış SQL sorgusu kullanarak yerel bir sql sorgusundan varlık nesnelerini almak için sözdizimi verilmiştir.
String sql = "SELECT * FROM EMPLOYEE WHERE id = :employee_id";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
query.setParameter("employee_id", 10);
List results = query.list();
Yerel SQL Örneği
Aşağıdaki POJO sınıfını düşünün -
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Çalışan nesnelerini depolamak için aşağıdaki EMPLOYEE tablosunu oluşturalım -
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Aşağıdaki eşleme dosyası olacak -
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name = "Employee" table = "EMPLOYEE">
<meta attribute = "class-description">
This class contains the employee detail.
</meta>
<id name = "id" type = "int" column = "id">
<generator class="native"/>
</id>
<property name = "firstName" column = "first_name" type = "string"/>
<property name = "lastName" column = "last_name" type = "string"/>
<property name = "salary" column = "salary" type = "int"/>
</class>
</hibernate-mapping>
Son olarak, kullanacağımız uygulamayı çalıştırmak için main () yöntemi ile uygulama sınıfımızı oluşturacağız. Native SQL sorgular -
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.SQLQuery;
import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try {
factory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Add few employee records in database */
Integer empID1 = ME.addEmployee("Zara", "Ali", 2000);
Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
Integer empID3 = ME.addEmployee("John", "Paul", 5000);
Integer empID4 = ME.addEmployee("Mohd", "Yasee", 3000);
/* List down employees and their salary using Scalar Query */
ME.listEmployeesScalar();
/* List down complete employees information using Entity Query */
ME.listEmployeesEntity();
}
/* Method to CREATE an employee in the database */
public Integer addEmployee(String fname, String lname, int salary){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try {
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employeeID = (Integer) session.save(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
return employeeID;
}
/* Method to READ all the employees using Scalar Query */
public void listEmployeesScalar( ){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
String sql = "SELECT first_name, salary FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List data = query.list();
for(Object object : data) {
Map row = (Map)object;
System.out.print("First Name: " + row.get("first_name"));
System.out.println(", Salary: " + row.get("salary"));
}
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
/* Method to READ all the employees using Entity Query */
public void listEmployeesEntity( ){
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
String sql = "SELECT * FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
List employees = query.list();
for (Iterator iterator = employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
}
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
}
Derleme ve Yürütme
Yukarıda belirtilen uygulamayı derleme ve çalıştırma adımları aşağıda verilmiştir. Derleme ve yürütme için ilerlemeden önce PATH ve CLASSPATH'ı uygun şekilde ayarladığınızdan emin olun.
Yapılandırma bölümünde açıklandığı gibi hibernate.cfg.xml yapılandırma dosyasını oluşturun.
Employee.hbm.xml eşleme dosyasını yukarıda gösterildiği gibi oluşturun.
Employee.java kaynak dosyasını yukarıda gösterildiği gibi oluşturun ve derleyin.
ManageEmployee.java kaynak dosyasını yukarıda gösterildiği gibi oluşturun ve derleyin.
Programı çalıştırmak için ManageEmployee ikili dosyasını çalıştırın.
Aşağıdaki sonucu alırsınız ve kayıtlar EMPLOYEE tablosunda oluşturulur.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Zara, Salary: 2000
First Name: Daisy, Salary: 5000
First Name: John, Salary: 5000
First Name: Mohd, Salary: 3000
First Name: Zara Last Name: Ali Salary: 2000
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 5000
First Name: Mohd Last Name: Yasee Salary: 3000
EMPLOYEE tablonuzu kontrol ederseniz, aşağıdaki kayıtlara sahip olmalıdır -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 26 | Zara | Ali | 2000 |
| 27 | Daisy | Das | 5000 |
| 28 | John | Paul | 5000 |
| 29 | Mohd | Yasee | 3000 |
+----+------------+-----------+--------+
4 rows in set (0.00 sec)
mysql>
Önbelleğe alma, bir sistemin performansını artıran bir mekanizmadır. Uygulama ve veritabanı arasında bulunan bir tampon bellektir. Önbellek, veritabanı isabetlerinin sayısını mümkün olduğunca azaltmak için son kullanılan veri öğelerini depolar.
Önbelleğe alma, Hazırda Bekletme için de önemlidir. Aşağıda açıklandığı gibi çok düzeyli bir önbelleğe alma şeması kullanır -
Birinci düzey Önbellek
Birinci düzey önbellek, Oturum önbelleğidir ve tüm isteklerin geçmesi gereken zorunlu bir önbellektir. Session nesnesi, bir nesneyi veritabanına kaydetmeden önce kendi gücü altında tutar.
Bir nesne için birden fazla güncelleme yayınlarsanız, Hazırda Bekletme, yayınlanan güncelleme SQL deyimlerinin sayısını azaltmak için mümkün olduğu kadar uzun süre güncellemeyi ertelemeye çalışır. Oturumu kapatırsanız, önbelleğe alınan tüm nesneler kaybolur ve veritabanında kalır veya güncellenir.
İkinci düzey Önbellek
İkinci düzey önbellek, isteğe bağlı bir önbellektir ve ikinci düzey önbellekte bir nesneyi bulmak için herhangi bir girişimde bulunulmadan önce birinci düzey önbelleğe her zaman başvurulur. İkinci seviye önbellek, sınıf ve koleksiyon bazında yapılandırılabilir ve temel olarak oturumlarda nesneleri önbelleğe almaktan sorumludur.
Herhangi bir üçüncü taraf önbelleği Hazırda Bekletme ile kullanılabilir. Birorg.hibernate.cache.CacheProvider Hazırda Bekletme'ye önbellek uygulamasının bir tanıtıcısı sağlamak için uygulanması gereken arabirim sağlanır.
Sorgu düzeyinde Önbellek
Hazırda bekletme ayrıca, ikinci düzey önbellekle yakından bütünleşen sorgu sonuç kümeleri için bir önbellek uygular.
Bu isteğe bağlı bir özelliktir ve önbelleğe alınan sorgu sonuçlarını ve bir tablonun en son güncellendiği zaman damgalarını tutan iki ek fiziksel önbellek bölgesi gerektirir. Bu, yalnızca aynı parametrelerle sık sık çalıştırılan sorgular için kullanışlıdır.
İkinci Seviye Önbellek
Hazırda bekletme, varsayılan olarak birinci düzey önbelleği kullanır ve birinci düzey önbelleği kullanmak için yapabileceğiniz hiçbir şey yoktur. Doğrudan isteğe bağlı ikinci düzey önbelleğe gidelim. Tüm sınıflar önbelleğe alma işleminden yararlanamaz, bu nedenle ikinci düzey önbelleği devre dışı bırakabilmek önemlidir.
Hazırda bekletme ikinci düzey önbelleği iki adımda ayarlanır. İlk olarak, hangi eşzamanlılık stratejisinin kullanılacağına karar vermelisiniz. Bundan sonra, önbellek sağlayıcısını kullanarak önbellek sona erme ve fiziksel önbellek özniteliklerini yapılandırırsınız.
Eşzamanlılık Stratejileri
Eşzamanlılık stratejisi, veri öğelerini önbellekte depolamaktan ve bunları önbellekten almaktan sorumlu olan bir aracıdır. İkinci düzey bir önbelleği etkinleştirecekseniz, her kalıcı sınıf ve koleksiyon için hangi eşzamanlı önbellek stratejisini kullanacağınıza karar vermeniz gerekecektir.
Transactional - Nadir bir güncelleme durumunda, eşzamanlı işlemlerde eski verileri önlemenin kritik olduğu, çoğunlukla okunan veriler için bu stratejiyi kullanın.
Read-write - Nadir bir güncelleme durumunda, eşzamanlı işlemlerde eski verileri önlemenin kritik olduğu durumlarda, çoğunlukla okunan veriler için bu stratejiyi tekrar kullanın.
Nonstrict-read-write- Bu strateji, önbellek ve veritabanı arasında tutarlılık garantisi vermez. Veriler hemen hemen hiç değişmiyorsa ve küçük bir eski veri olasılığı kritik önem taşımıyorsa bu stratejiyi kullanın.
Read-only- Veriler için uygun, asla değişmeyen bir eşzamanlılık stratejisi. Yalnızca referans verileri için kullanın.
Bizim için ikinci düzey önbelleğe alma kullanacaksak Employee sınıfında, Hibernate'e Okuma-yazma stratejisini kullanarak Çalışan örneklerini önbelleğe almasını söylemek için gereken eşleme öğesini ekleyelim.
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name = "Employee" table = "EMPLOYEE">
<meta attribute = "class-description">
This class contains the employee detail.
</meta>
<cache usage = "read-write"/>
<id name = "id" type = "int" column = "id">
<generator class="native"/>
</id>
<property name = "firstName" column = "first_name" type = "string"/>
<property name = "lastName" column = "last_name" type = "string"/>
<property name = "salary" column = "salary" type = "int"/>
</class>
</hibernate-mapping>
Use = "read-write" özelliği, Hibernate'e tanımlanan önbellek için bir okuma-yazma eşzamanlılık stratejisi kullanmasını söyler.
Önbellek Sağlayıcı
Eşzamanlılık stratejilerini değerlendirdikten sonraki adımınız, bir önbellek sağlayıcısı seçmek için önbellek adayı sınıflarınızı kullanacaksınız. Hazırda bekletme, sizi tüm uygulama için tek bir önbellek sağlayıcısı seçmeye zorlar.
Sr.No. | Önbellek Adı ve Açıklaması |
---|---|
1 | EHCache Bellekte veya diskte ve kümelenmiş önbelleğe alabilir ve isteğe bağlı Hazırda Bekletme sorgusu sonuç önbelleğini destekler. |
2 | OSCache Zengin bir sona erme ilkeleri ve sorgu önbellek desteğiyle tek bir JVM'de belleğe ve diske önbelleğe almayı destekler. |
3 | warmCache JGroups tabanlı bir küme önbelleği. Kümelenmiş geçersiz kılma kullanır, ancak Hazırda Beklet sorgu önbelleğini desteklemez. |
4 | JBoss Cache Tamamen işlemsel, çoğaltılmış kümelenmiş bir önbellek ayrıca JGroups çok noktaya yayın kitaplığını temel alır. Çoğaltma veya geçersiz kılmayı, eşzamanlı veya eşzamansız iletişimi ve iyimser ve karamsar kilitlemeyi destekler. Hazırda bekletme sorgu önbelleği desteklenmektedir. |
Her önbellek sağlayıcısı, her eşzamanlılık stratejisiyle uyumlu değildir. Aşağıdaki uyumluluk matrisi, uygun bir kombinasyon seçmenize yardımcı olacaktır.
Strateji / Sağlayıcı | Sadece oku | Kısıtlı okuma yazma | Okuma yazma | İşlemsel |
---|---|---|---|---|
EHCache | X | X | X | |
OSCache | X | X | X | |
SwarmCache | X | X | ||
JBoss Önbelleği | X | X |
Hibernate.cfg.xml yapılandırma dosyasında bir önbellek sağlayıcısı belirteceksiniz. İkinci seviye önbellek sağlayıcımız olarak EHCache'yi seçiyoruz -
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name = "hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name = "hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- Assume students is the database name -->
<property name = "hibernate.connection.url">
jdbc:mysql://localhost/test
</property>
<property name = "hibernate.connection.username">
root
</property>
<property name = "hibernate.connection.password">
root123
</property>
<property name = "hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<!-- List of XML mapping files -->
<mapping resource = "Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Şimdi, önbellek bölgelerinin özelliklerini belirlemeniz gerekiyor. EHCache'nin kendi yapılandırma dosyası vardır,ehcache.xml, uygulamanın CLASSPATH içinde olması gerekir. Employee sınıfı için ehcache.xml'deki bir önbellek yapılandırması şöyle görünebilir -
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory = "1000"
eternal = "false"
timeToIdleSeconds = "120"
timeToLiveSeconds = "120"
overflowToDisk = "true"
/>
<cache name = "Employee"
maxElementsInMemory = "500"
eternal = "true"
timeToIdleSeconds = "0"
timeToLiveSeconds = "0"
overflowToDisk = "false"
/>
İşte bu, şimdi Çalışan sınıfı ve Hazırda Bekletme için ikinci düzey önbelleğe almayı etkinleştirdik, artık bir Çalışana her gittiğinizde veya tanımlayıcıya göre bir Çalışanı yüklediğinizde ikinci düzey önbelleğe ulaşıyor.
Tüm sınıflarınızı analiz etmeli ve her sınıf için uygun önbelleğe alma stratejisini seçmelisiniz. Bazen, ikinci düzey önbelleğe alma, uygulamanın performansını düşürebilir. Bu nedenle, önbelleğe almayı etkinleştirmeden önce uygulamanızı karşılaştırmanız ve daha sonra uygun önbelleğe almayı etkinleştirmeniz ve performansı kontrol etmeniz önerilir. Önbelleğe alma sistem performansını iyileştirmiyorsa, herhangi bir tür önbelleğe almayı etkinleştirmenin bir anlamı yoktur.
Sorgu Düzeyinde Önbellek
Sorgu önbelleğini kullanmak için önce şunu kullanarak etkinleştirmelisiniz: hibernate.cache.use_query_cache="true"yapılandırma dosyasındaki özellik. Bu özelliği true olarak ayarlayarak, Hazırda Bekletme'nin sorguyu ve tanımlayıcı kümelerini tutmak için bellekte gerekli önbellekleri oluşturmasını sağlarsınız.
Ardından, sorgu önbelleğini kullanmak için, Query sınıfının setCacheable (Boolean) yöntemini kullanırsınız. Örneğin -
Session session = SessionFactory.openSession();
Query query = session.createQuery("FROM EMPLOYEE");
query.setCacheable(true);
List users = query.list();
SessionFactory.closeSession();
Hazırda bekletme ayrıca bir önbellek bölgesi konseptiyle çok ince taneli önbellek desteğini de destekler. Önbellek bölgesi, ad verilen önbelleğin bir parçasıdır.
Session session = SessionFactory.openSession();
Query query = session.createQuery("FROM EMPLOYEE");
query.setCacheable(true);
query.setCacheRegion("employee");
List users = query.list();
SessionFactory.closeSession();
Bu kod, Hibernate'e sorguyu önbelleğin çalışan alanında depolamasını ve aramasını söylemek için yöntemi kullanır.
Hibernate kullanarak veritabanınıza çok sayıda kayıt yüklemeniz gereken bir durumu düşünün. Hibernate kullanarak bunu başarmak için kod parçacığı aşağıdadır -
Session session = SessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Employee employee = new Employee(.....);
session.save(employee);
}
tx.commit();
session.close();
Varsayılan olarak, Hazırda Bekletme, oturum düzeyinde önbellekteki tüm kalıcı nesneleri önbelleğe alır ve sonuçta uygulamanız bir OutOfMemoryException50.000'inci sıra civarında bir yerde. Kullanıyorsanız bu sorunu çözebilirsiniz.batch processing Hazırda bekletme ile.
Toplu işleme özelliğini kullanmak için önce hibernate.jdbc.batch_sizeparti boyutu olarak, nesne boyutuna bağlı olarak 20 veya 50 olan bir sayıya. Bu, hazırda bekletme konteynerine her X satırının toplu olarak ekleneceğini söyleyecektir. Bunu kodunuza uygulamak için, aşağıdaki gibi küçük değişiklikler yapmamız gerekir -
Session session = SessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Employee employee = new Employee(.....);
session.save(employee);
if( i % 50 == 0 ) { // Same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close();
Yukarıdaki kod INSERT işlemi için iyi çalışacaktır, ancak UPDATE işlemini yapmak istiyorsanız, aşağıdaki kodu kullanarak gerçekleştirebilirsiniz -
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
ScrollableResults employeeCursor = session.createQuery("FROM EMPLOYEE").scroll();
int count = 0;
while ( employeeCursor.next() ) {
Employee employee = (Employee) employeeCursor.get(0);
employee.updateEmployee();
seession.update(employee);
if ( ++count % 50 == 0 ) {
session.flush();
session.clear();
}
}
tx.commit();
session.close();
Toplu İşleme Örneği
Eklemek için yapılandırma dosyasını değiştirelim hibernate.jdbc.batch_size özellik -
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name = "hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name = "hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- Assume students is the database name -->
<property name = "hibernate.connection.url">
jdbc:mysql://localhost/test
</property>
<property name = "hibernate.connection.username">
root
</property>
<property name = "hibernate.connection.password">
root123
</property>
<property name = "hibernate.jdbc.batch_size">
50
</property>
<!-- List of XML mapping files -->
<mapping resource = "Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Aşağıdaki POJO Employee sınıfını düşünün -
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Employee nesnelerini depolamak için aşağıdaki EMPLOYEE tablosunu oluşturalım -
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Aşağıda, Çalışan nesnelerini EMPLOYEE tablosu ile eşlemek için eşleme dosyası olacaktır -
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name = "Employee" table = "EMPLOYEE">
<meta attribute = "class-description">
This class contains the employee detail.
</meta>
<id name = "id" type = "int" column = "id">
<generator class="native"/>
</id>
<property name = "firstName" column = "first_name" type = "string"/>
<property name = "lastName" column = "last_name" type = "string"/>
<property name = "salary" column = "salary" type = "int"/>
</class>
</hibernate-mapping>
Son olarak, kullanacağımız uygulamayı çalıştırmak için main () yöntemi ile uygulama sınıfımızı oluşturacağız. flush() ve clear() Session nesnesiyle kullanılabilen yöntemler, böylece Hibernate bu kayıtları bellekte önbelleğe almak yerine veritabanına yazmaya devam eder.
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try {
factory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Add employee records in batches */
ME.addEmployees( );
}
/* Method to create employee records in batches */
public void addEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try {
tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
String fname = "First Name " + i;
String lname = "Last Name " + i;
Integer salary = i;
Employee employee = new Employee(fname, lname, salary);
session.save(employee);
if( i % 50 == 0 ) {
session.flush();
session.clear();
}
}
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
return ;
}
}
Derleme ve Yürütme
Yukarıda belirtilen uygulamayı derleme ve çalıştırma adımları aşağıda verilmiştir. Derleme ve yürütme için ilerlemeden önce PATH ve CLASSPATH'ı uygun şekilde ayarladığınızdan emin olun.
Hibernate.cfg.xml yapılandırma dosyasını yukarıda açıklandığı gibi oluşturun.
Employee.hbm.xml eşleme dosyasını yukarıda gösterildiği gibi oluşturun.
Employee.java kaynak dosyasını yukarıda gösterildiği gibi oluşturun ve derleyin.
ManageEmployee.java kaynak dosyasını yukarıda gösterildiği gibi oluşturun ve derleyin.
EMPLOYEE tablosunda 100000 kayıt oluşturacak programı çalıştırmak için ManageEmployee ikili dosyasını çalıştırın.
Hazırda Bekletme'de bir nesne yaratılacağını ve kalıcı olacağını öğrendiğiniz gibi. Nesne değiştirildikten sonra, veritabanına geri kaydedilmelidir. Bu işlem, nesneye bir sonraki ihtiyaç duyulana kadar devam eder ve kalıcı depodan yüklenecektir.
Böylece bir nesne yaşam döngüsünde farklı aşamalardan geçer ve Interceptor Interfacebazı gerekli görevleri gerçekleştirmek için farklı aşamalarda çağrılabilen yöntemler sağlar. Bu yöntemler, uygulamanın kaydedilmeden, güncellenmeden, silinmeden veya yüklenmeden önce kalıcı bir nesnenin özelliklerini incelemesine ve / veya değiştirmesine olanak tanıyan oturumdan uygulamaya yapılan geri aramalardır. Interceptor arayüzünde bulunan tüm yöntemlerin listesi aşağıdadır -
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | findDirty() Bu yöntem, flush() yöntem bir Session nesnesinde çağrılır. |
2 | instantiate() Bu yöntem, kalıcı bir sınıf başlatıldığında çağrılır. |
3 | isUnsaved() Bu yöntem, bir nesneye bir nesne iletildiğinde çağrılır. saveOrUpdate() yöntem/ |
4 | onDelete() Bu yöntem, bir nesne silinmeden önce çağrılır. |
5 | onFlushDirty() Bu yöntem, Hazırda Bekletme, yıkama yani güncelleme işlemi sırasında bir nesnenin kirli olduğunu (yani değiştirildiğini) algıladığında çağrılır. |
6 | onLoad() Bu yöntem, bir nesne başlatılmadan önce çağrılır. |
7 | onSave() Bu yöntem, bir nesne kaydedilmeden önce çağrılır. |
8 | postFlush() Bu yöntem, bir temizleme gerçekleştikten ve bellekte bir nesne güncellendikten sonra çağrılır. |
9 | preFlush() Bu yöntem, yıkamadan önce çağrılır. |
Hibernate Interceptor, bir nesnenin hem uygulamaya hem de veritabanına nasıl görüneceği konusunda bize tam kontrol sağlar.
Durdurucular Nasıl Kullanılır?
Bir durdurucu oluşturmak için, aşağıdakilerden birini uygulayabilirsiniz: Interceptor doğrudan sınıflandırma veya genişletme EmptyInterceptorsınıf. Aşağıda, Hazırda Bekletme Durdurucu işlevini kullanmanın basit adımları anlatılacaktır.
Durdurucular Oluşturun
Interceptor yönteminin ne zaman otomatik olarak çağrılacağı örneğimizde EmptyInterceptor'ı genişleteceğiz. Employeenesne oluşturulur ve güncellenir. Gereksinimlerinize göre daha fazla yöntem uygulayabilirsiniz.
import java.io.Serializable;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.EmptyInterceptor;
import org.hibernate.Transaction;
import org.hibernate.type.Type;
public class MyInterceptor extends EmptyInterceptor {
private int updates;
private int creates;
private int loads;
public void onDelete(Object entity, Serializable id,
Object[] state, String[] propertyNames, Type[] types) {
// do nothing
}
// This method is called when Employee object gets updated.
public boolean onFlushDirty(Object entity, Serializable id,
Object[] currentState, Object[] previousState, String[] propertyNames,
Type[] types) {
if ( entity instanceof Employee ) {
System.out.println("Update Operation");
return true;
}
return false;
}
public boolean onLoad(Object entity, Serializable id,
Object[] state, String[] propertyNames, Type[] types) {
// do nothing
return true;
}
// This method is called when Employee object gets created.
public boolean onSave(Object entity, Serializable id,
Object[] state, String[] propertyNames, Type[] types) {
if ( entity instanceof Employee ) {
System.out.println("Create Operation");
return true;
}
return false;
}
//called before commit into database
public void preFlush(Iterator iterator) {
System.out.println("preFlush");
}
//called after committed into database
public void postFlush(Iterator iterator) {
System.out.println("postFlush");
}
}
POJO Sınıfları Oluşturun
Şimdi, EMPLOYEE masasını ve Employee sınıfını birlikte oynamak için kullandığımız ilk örneğimizi biraz değiştirelim -
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Veritabanı Tabloları Oluşturun
İkinci adım, veritabanınızda tablolar oluşturmak olacaktır. Her nesneye karşılık gelen bir tablo olacaktır, kalıcılık sağlamaya istekli olursunuz. Yukarıda açıklanan nesneleri, aşağıdaki RDBMS tablosunda saklanması ve geri alınması gerektiğini düşünün -
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Eşleme Yapılandırma Dosyası Oluşturun
Bu adım, Hazırda Bekletme komutunu veren bir eşleme dosyası oluşturmaktır - tanımlanan sınıf veya sınıfların veritabanı tablolarıyla nasıl eşleneceği.
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name = "Employee" table = "EMPLOYEE">
<meta attribute = "class-description">
This class contains the employee detail.
</meta>
<id name = "id" type = "int" column = "id">
<generator class="native"/>
</id>
<property name = "firstName" column = "first_name" type = "string"/>
<property name = "lastName" column = "last_name" type = "string"/>
<property name = "salary" column = "salary" type = "int"/>
</class>
</hibernate-mapping>
Uygulama Sınıfı Oluşturun
Son olarak, uygulamayı çalıştırmak için main () yöntemi ile uygulama sınıfımızı oluşturacağız. Burada, oturum nesnesi oluştururken Interceptor sınıfımızı argüman olarak kullandığımıza dikkat edilmelidir.
import java.util.List;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try {
factory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Add few employee records in database */
Integer empID1 = ME.addEmployee("Zara", "Ali", 1000);
Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
Integer empID3 = ME.addEmployee("John", "Paul", 10000);
/* List down all the employees */
ME.listEmployees();
/* Update employee's records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down new list of the employees */
ME.listEmployees();
}
/* Method to CREATE an employee in the database */
public Integer addEmployee(String fname, String lname, int salary){
Session session = factory.openSession( new MyInterceptor() );
Transaction tx = null;
Integer employeeID = null;
try {
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employeeID = (Integer) session.save(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
return employeeID;
}
/* Method to READ all the employees */
public void listEmployees( ){
Session session = factory.openSession( new MyInterceptor() );
Transaction tx = null;
try {
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator = employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
}
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
/* Method to UPDATE salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession( new MyInterceptor() );
Transaction tx = null;
try {
tx = session.beginTransaction();
Employee employee = (Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
/* Method to DELETE an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession( new MyInterceptor() );
Transaction tx = null;
try {
tx = session.beginTransaction();
Employee employee = (Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
} catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
}
Derleme ve Yürütme
Yukarıda belirtilen uygulamayı derleme ve çalıştırma adımları aşağıda verilmiştir. Derleme ve yürütme için ilerlemeden önce PATH ve CLASSPATH'ı uygun şekilde ayarladığınızdan emin olun.
Yapılandırma bölümünde açıklandığı gibi hibernate.cfg.xml yapılandırma dosyasını oluşturun.
Employee.hbm.xml eşleme dosyasını yukarıda gösterildiği gibi oluşturun.
Employee.java kaynak dosyasını yukarıda gösterildiği gibi oluşturun ve derleyin.
MyInterceptor.java kaynak dosyasını yukarıda gösterildiği gibi oluşturun ve derleyin.
ManageEmployee.java kaynak dosyasını yukarıda gösterildiği gibi oluşturun ve derleyin.
Programı çalıştırmak için ManageEmployee ikili dosyasını çalıştırın.
Aşağıdaki sonucu alırsınız ve kayıtlar EMPLOYEE tablosunda oluşturulur.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
Create Operation
preFlush
postFlush
Create Operation
preFlush
postFlush
Create Operation
preFlush
postFlush
First Name: Zara Last Name: Ali Salary: 1000
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 10000
preFlush
postFlush
preFlush
Update Operation
postFlush
preFlush
postFlush
First Name: Zara Last Name: Ali Salary: 5000
First Name: John Last Name: Paul Salary: 10000
preFlush
postFlush
EMPLOYEE tablonuzu kontrol ederseniz, aşağıdaki kayıtlara sahip olmalıdır -
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 29 | Zara | Ali | 5000 |
| 31 | John | Paul | 10000 |
+----+------------+-----------+--------+
2 rows in set (0.00 sec
mysql>