Java ile veritabanı işlemleri yapıyorsanız ve hibernate ile tanışmadıysanız bu konu sizin için devrim niteliğinde olacaktır. Hibernate kısaca java nesnelerinin ilişkisel veritabanında birebir karşılığının tutulmasını sağlar. Her tutulan nesne veritabanında ki bir tabloya karşılık gelmektedir. Bu yöntem ile karmaşık sql sorgularına gerek kalmadan tablolar üzerinde her türlü işlem gerçekleştirilebilir.
Hibernate Kullanmanın Avantajları Nelerdir?
- Hibernate ile veritabanında tabloları oluşturmaya ve tabloların birbirleriyle ilişkilerini tanımlamaya gerek kalmaz.
- Projenin bakımını ve güncellenmesini kolaylaştırır.
- Tabloya yeni bir alan eklemek gerektiğinde kod kısmında oluşacak hatalar en aza indirilir.
- Karmaşık sql sorguları ile uğraşmadan verilere erişim sağlanır.
- Projenin farklı veritabanlarına taşıma işlemi basit ve hızlıdır.
Günümüzde kurumsal java uygulamalarında hibernate ve spring kullanımı standart hale gelmiştir.
Hibernate’in Java Projesine Eklenmesi
Hibernate açık kaynak kodlu ve ücretsiz bir ORM’dir. Hibernate’i kullanmaya başlamak için gerekli jar dosyalarını http://hibernate.org/orm/ adresinden indirerek yada maven yardımı ile java projesine eklemeniz gerekir.
Yukarıdaki hibernate kütüphanelerini indirdiğiniz dosyanın içerisinde lib klasörü altında bulabilirsiniz.
Bu işlemden sonra bir tane hibernate ayar dosyası oluşturmanız gerekir. Bu dosya hibernate’in projeniz ve veritabanıyla haberleşmesini sağlayan tüm ayarların yer aldığı dosyadır. Örnek hibernate ayar dosyaları indirdiğiniz klasör içerisinde hibernate.cfg.xml adıyla bulunmaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/koorddb?createDatabaseIfNotExist=true</property> <property name="connection.username">root</property> <property name="connection.password">sifre</property> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">1</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">update</property> <mapping class="models.Tanimlamalar"></mapping> <mapping class="models.Alanlar"></mapping> <mapping class="models.Koordinatorler"></mapping> <mapping class="models.Isletmeler"></mapping> <mapping class="models.Ogrenciler"></mapping> <mapping class="models.HaftalikProgram"></mapping> <mapping class="models.GorevKayitlari"></mapping> </session-factory> </hibernate-configuration> |
Yukarıdaki ayar dosyası mysql veritabanına bağlanmak için oluşturulmuştur. Proje derlendiğinde veritabanı yoksa en alttaki tablolar ve içerisindeki alanlar model nesnelerinden otomatik oluşturulur.
Aşağıda nesne bir okuldaki alanları modellemek için kullanılmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
@Entity public class Alanlar { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int alanId; private String alanAdi; public int getAlanId() { return alanId; } public void setAlanId(int alanId) { this.alanId = alanId; } public String getAlanAdi() { return alanAdi; } public void setAlanAdi(String alanAdi) { this.alanAdi = alanAdi; } @OneToMany(mappedBy="alan") private Set<Koordinatorler> koordinator; @OneToMany(mappedBy="alan") private Set<Ogrenciler> alanlar; } |
Model incelendiğinde bu nesnenin koordinatorler ve ogrenciler nesnelerinde ki bir alana karşılık geldiği görülmektedir. Bu durum ilişkisel veritabanında foreign key olarak gerçekleştirilir.
@ ile başlayan kodlar Annotations olarak adlandırılır. Bu konuyla ilgili detaylı bir yazı yazmayı planlıyorum. O zamana kadar http://www.tutorialspoint.com/hibernate/hibernate_annotations.htm adresinde ki ingilizce açıklamalardan faydalanabilirsiniz.
Modelleme işlemini de yaptıktan sonra geriye en önemli nokta olan verilerin kaydedilmesi, çekilmesi silinmesi ve güncellenmesi işlemi kaldı.
Aşağıda veritabanı üzerinde bu işlemlerin gerçekleştirilmesi için gerekli kodları metotlar halinde gösterdim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session; private static List<Alanlar> alanlar; //Alan bilgilerini veritabanından alarak bir List içerisine aktaralım. public void alanBilgileriniGetir(){ session=sessionFactory.openSession(); session.beginTransaction(); Criteria cr=session.createCriteria(Alanlar.class); alanlar=cr.list(); session.close(); } //Bir alanı veritabanına ekleyelim. private void alanKaydet (){ Alanlar alan= new Alanlar(); alan.setAlanAdi(txtAlanAdi.getText().toUpperCase()); session=sessionFactory.openSession(); session.beginTransaction(); session.save(alan); session.getTransaction().commit(); session.close(); } //Bir alanı veritabanından silelim. private void alanSil(){ session=sessionFactory.openSession(); session.beginTransaction(); Alanlar alan=new Alanlar(); alan.setAlanId(1); session.delete(alan); session.getTransaction().commit(); session.close(); } |
Merhabalar,
Ben C#’da çok iyiym fakat Java Kodlamak istiyorum. Framework olarak ise HiberNate kullanmak istiyorum ama ne java nın nede Hibernate in neresinden başlayacağımı bilmiyorum bana yol gösterebilir misiniz ?