{"id":34989,"date":"2025-11-24T13:01:20","date_gmt":"2025-11-24T10:01:20","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/"},"modified":"2025-11-24T13:01:20","modified_gmt":"2025-11-24T10:01:20","slug":"hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/","title":{"rendered":"Hibernate ile Java&#8217;da XML Konfig\u00fcrasyonu: Ad\u0131m Ad\u0131m Rehber"},"content":{"rendered":"<p><body><\/p>\n<p>Java uygulamalar\u0131n\u0131zda veritaban\u0131 i\u015flemlerini daha az kodla ve daha etkili bir \u015fekilde y\u00f6netmek ister misiniz? Hibernate, bu s\u00fcreci basitle\u015ftiren g\u00fc\u00e7l\u00fc bir ORM arac\u0131d\u0131r. Bu makalede, Hibernate&#8217;\u0131 XML tabanl\u0131 yap\u0131land\u0131rma ile ad\u0131m ad\u0131m nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ke\u015ffedecek, veritaban\u0131 entegrasyonunuzu g\u00fc\u00e7lendireceksiniz.<\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, uygulamalar\u0131n verileri kal\u0131c\u0131 olarak depolamas\u0131 ve bu verilere eri\u015fmesi ka\u00e7\u0131n\u0131lmaz bir gerekliliktir. Geleneksel olarak, Java uygulamalar\u0131 bu ama\u00e7la JDBC (Java Database Connectivity) API&#8217;sini kullan\u0131r. Ancak, JDBC do\u011frudan SQL sorgular\u0131yla \u00e7al\u0131\u015fmay\u0131 gerektirdi\u011fi i\u00e7in bir\u00e7ok zorlu\u011fu beraberinde getirir. Veritaban\u0131 tablolar\u0131ndaki her bir sat\u0131r\u0131 Java nesnelerine d\u00f6n\u00fc\u015ft\u00fcrmek, bu nesneleri g\u00fcncellemek veya silmek i\u00e7in s\u00fcrekli SQL sorgular\u0131 yazmak ve sonu\u00e7 setlerini manuel olarak i\u015flemek, tekrar eden ve hata yapmaya a\u00e7\u0131k bir s\u00fcre\u00e7tir. Bu &#8220;boilerplate&#8221; kod, geli\u015ftiricilerin as\u0131l i\u015f mant\u0131\u011f\u0131na odaklanmas\u0131n\u0131 engeller ve projenin bak\u0131m\u0131n\u0131 zorla\u015ft\u0131r\u0131r. \u00dcstelik, farkl\u0131 veritabanlar\u0131 aras\u0131nda ge\u00e7i\u015f yapmak istedi\u011finizde, SQL sorgular\u0131n\u0131zda veya veri tiplerinizde de\u011fi\u015fiklikler yapman\u0131z gerekebilir, bu da esnekli\u011fi azalt\u0131r.<\/p>\n<p>\u0130\u015fte tam da bu noktada ORM (Object-Relational Mapping) ara\u00e7lar\u0131 devreye girer. ORM, nesne y\u00f6nelimli programlama dilleri ile ili\u015fkisel veritabanlar\u0131 aras\u0131ndaki uyumsuzlu\u011fu \u00e7\u00f6zmeye odaklanan bir programlama tekni\u011fidir. K\u0131sacas\u0131, uygulaman\u0131zdaki Java nesnelerini (\u00f6rne\u011fin, bir <code>Ogrenci<\/code> nesnesi) do\u011frudan veritaban\u0131 tablolar\u0131na (<code>ogrenciler<\/code> tablosu) e\u015flemeyi sa\u011flar. Bu sayede, geli\u015ftiriciler SQL sorgular\u0131 yazmak yerine, Java nesneleri \u00fczerinde i\u015flem yaparak veritaban\u0131yla etkile\u015fime girebilirler. ORM ara\u00e7lar\u0131, bu e\u015fleme i\u015flemini arka planda otomatik olarak halleder, b\u00f6ylece CRUD (Create, Read, Update, Delete) operasyonlar\u0131 \u00e7ok daha basit ve okunabilir hale gelir.<\/p>\n<p>Hibernate, Java ekosistemindeki en pop\u00fcler ve g\u00fc\u00e7l\u00fc ORM framework&#8217;lerinden biridir. JPA (Java Persistence API) standard\u0131n\u0131n bir uygulamas\u0131d\u0131r ve geli\u015ftiricilere, veritaban\u0131 etkile\u015fimlerini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde soyutlayarak daha temiz ve s\u00fcrd\u00fcr\u00fclebilir kod yazma imkan\u0131 sunar. Hibernate ile \u00e7al\u0131\u015f\u0131rken, veritaban\u0131 tablolar\u0131n\u0131zla e\u015fle\u015fen POJO (Plain Old Java Object) s\u0131n\u0131flar\u0131 tan\u0131mlars\u0131n\u0131z. Ard\u0131ndan, Hibernate&#8217;\u0131n yap\u0131land\u0131rma dosyalar\u0131 arac\u0131l\u0131\u011f\u0131yla bu POJO&#8217;lar\u0131n hangi veritaban\u0131 tablosuna, hangi alan\u0131n hangi s\u00fctuna kar\u015f\u0131l\u0131k geldi\u011fini belirtirsiniz. Bu e\u015fleme, XML dosyalar\u0131 veya Java anotasyonlar\u0131 kullan\u0131larak yap\u0131labilir. Bu makalenin odak noktas\u0131, esnekli\u011fi ve a\u00e7\u0131k yap\u0131s\u0131 nedeniyle hala bir\u00e7ok projede tercih edilen XML tabanl\u0131 konfig\u00fcrasyon olacakt\u0131r. Hibernate, geli\u015ftiricilere sadece veritaban\u0131 etkile\u015fimini basitle\u015ftirmekle kalmaz, ayn\u0131 zamanda geli\u015fmi\u015f \u00f6nbellekleme mekanizmalar\u0131, lazy loading, oturum y\u00f6netimi ve g\u00fc\u00e7l\u00fc sorgulama dilleri (HQL &#8211; Hibernate Query Language veya Criteria API) gibi \u00f6zellikler sunarak performans\u0131 ve \u00f6l\u00e7eklenebilirli\u011fi de art\u0131r\u0131r. T\u00fcm bu avantajlar sayesinde, Hibernate, karma\u015f\u0131k veritaban\u0131 i\u015flemlerini y\u00f6netmek i\u00e7in vazge\u00e7ilmez bir ara\u00e7 haline gelmi\u015ftir.<\/p>\n<h2>XML Tabanl\u0131 Hibernate Konfig\u00fcrasyonunun Temelleri Nelerdir?<\/h2>\n<p>Hibernate&#8217;\u0131n g\u00fcc\u00fcn\u00fc kullanmaya ba\u015flamak i\u00e7in \u00f6ncelikle onu do\u011fru \u015fekilde yap\u0131land\u0131rmam\u0131z gerekir. Hibernate&#8217;\u0131n XML tabanl\u0131 konfig\u00fcrasyonu, uygulaman\u0131z\u0131n veritaban\u0131na nas\u0131l ba\u011flanaca\u011f\u0131n\u0131, hangi varl\u0131k s\u0131n\u0131flar\u0131n\u0131 y\u00f6netece\u011fini ve genel \u00e7al\u0131\u015fma davran\u0131\u015f\u0131n\u0131 tan\u0131mlad\u0131\u011f\u0131n\u0131z merkez\u00ee bir noktad\u0131r. Bu yakla\u015f\u0131m, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k projelerde, yap\u0131land\u0131rma detaylar\u0131n\u0131 koddan ay\u0131rarak daha temiz ve y\u00f6netilebilir bir kod taban\u0131 olu\u015fturman\u0131za yard\u0131mc\u0131 olur. Temel olarak, Hibernate&#8217;\u0131n XML konfig\u00fcrasyonu iki ana dosyadan olu\u015fur: <code>hibernate.cfg.xml<\/code> ve varl\u0131k e\u015fleme dosyalar\u0131 (genellikle <code>.hbm.xml<\/code> uzant\u0131l\u0131).<\/p>\n<h3>hibernate.cfg.xml Dosyas\u0131n\u0131n Rol\u00fc ve \u0130\u00e7eri\u011fi<\/h3>\n<p><code>hibernate.cfg.xml<\/code> dosyas\u0131, Hibernate uygulaman\u0131z\u0131n kalbidir ve genellikle <code>src\/main\/resources<\/code> klas\u00f6r\u00fc alt\u0131nda bulunur. Bu dosya, veritaban\u0131 ba\u011flant\u0131 detaylar\u0131ndan Hibernate&#8217;\u0131n genel davran\u0131\u015f\u0131na kadar bir\u00e7ok temel ayar\u0131 i\u00e7erir. \u0130\u015fte bu dosyan\u0131n ana bile\u015fenleri:<\/p>\n<ul>\n<li><strong>Veritaban\u0131 Ba\u011flant\u0131 Ayarlar\u0131:<\/strong> Hibernate&#8217;\u0131n veritaban\u0131n\u0131zla ileti\u015fim kurabilmesi i\u00e7in JDBC s\u00fcr\u00fcc\u00fcs\u00fc, veritaban\u0131 URL&#8217;si, kullan\u0131c\u0131 ad\u0131 ve \u015fifre gibi bilgilere ihtiyac\u0131 vard\u0131r. Bu ayarlar <code><property><\/code> etiketleri i\u00e7inde belirtilir. \u00d6rne\u011fin, MySQL i\u00e7in <code>hibernate.connection.driver_class<\/code>, <code>hibernate.connection.url<\/code>, <code>hibernate.connection.username<\/code> ve <code>hibernate.connection.password<\/code> gibi \u00f6zellikler kullan\u0131l\u0131r.<\/li>\n<li><strong>Veritaban\u0131 Diyalekti (Dialect):<\/strong> Her veritaban\u0131n\u0131n kendine \u00f6zg\u00fc SQL leh\u00e7esi vard\u0131r. Hibernate, bu farkl\u0131l\u0131klar\u0131 soyutlamak i\u00e7in bir diyalekt kullan\u0131r. \u00d6rne\u011fin, MySQL i\u00e7in <code>org.hibernate.dialect.MySQL8Dialect<\/code> veya PostgreSQL i\u00e7in <code>org.hibernate.dialect.PostgreSQLDialect<\/code> gibi bir de\u011fer belirtirsiniz. Bu, Hibernate&#8217;\u0131n veritaban\u0131n\u0131za uygun SQL sorgular\u0131 olu\u015fturmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>\u015eema Olu\u015fturma Politikas\u0131 (Schema Generation):<\/strong> Geli\u015ftirme a\u015famas\u0131nda olduk\u00e7a faydal\u0131 olan <code>hibernate.hbm2ddl.auto<\/code> \u00f6zelli\u011fi, Hibernate&#8217;\u0131n varl\u0131k e\u015flemelerinize g\u00f6re veritaban\u0131 \u015femas\u0131n\u0131 otomatik olarak olu\u015fturmas\u0131n\u0131, g\u00fcncellemesini veya silmesini sa\u011flar. De\u011ferleri aras\u0131nda <code>create<\/code> (her zaman yeni \u015fema olu\u015ftur), <code>create-drop<\/code> (uygulama kapand\u0131\u011f\u0131nda \u015femay\u0131 sil), <code>update<\/code> (\u015femay\u0131 g\u00fcncel if not exists) ve <code>validate<\/code> (\u015femay\u0131 do\u011frula) bulunur. \u00dcretim ortamlar\u0131nda <code>validate<\/code> veya bo\u015f b\u0131rakmak daha g\u00fcvenlidir.<\/li>\n<li><strong>SQL G\u00fcnl\u00fc\u011fe Kaydetme (SQL Logging):<\/strong> <code>hibernate.show_sql<\/code> \u00f6zelli\u011fi <code>true<\/code> olarak ayarland\u0131\u011f\u0131nda, Hibernate&#8217;\u0131n arka planda \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131 t\u00fcm SQL sorgular\u0131 konsola yazd\u0131r\u0131l\u0131r. Bu, hata ay\u0131klama ve performans analizi i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r. <code>hibernate.format_sql<\/code> ile de bu sorgular\u0131n daha okunabilir formatta g\u00f6sterilmesi sa\u011flanabilir.<\/li>\n<li><strong>Varl\u0131k E\u015fleme Dosyalar\u0131n\u0131n Tan\u0131mlanmas\u0131:<\/strong> En \u00f6nemli k\u0131s\u0131mlardan biri, Hibernate&#8217;a hangi varl\u0131k s\u0131n\u0131flar\u0131n\u0131 (POJO&#8217;lar\u0131) ve bunlar\u0131n e\u015fleme dosyalar\u0131n\u0131 y\u00f6netece\u011fini s\u00f6ylemektir. Bu, her bir <code>.hbm.xml<\/code> dosyas\u0131 i\u00e7in bir <code><mapping resource=\"com\/example\/model\/Ogrenci.hbm.xml\"\/><\/code> etiketi eklenerek yap\u0131l\u0131r. Bu, Hibernate&#8217;\u0131n varl\u0131k tan\u0131mlar\u0131n\u0131z\u0131 y\u00fcklemesini ve i\u00e7 modelini olu\u015fturmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<h3>Varl\u0131k E\u015fleme Dosyalar\u0131 (.hbm.xml)<\/h3>\n<p>Varl\u0131k e\u015fleme dosyalar\u0131, uygulaman\u0131zdaki her bir POJO s\u0131n\u0131f\u0131n\u0131n veritaban\u0131ndaki kar\u015f\u0131l\u0131\u011f\u0131 olan bir tabloya nas\u0131l e\u015flendi\u011fini detayl\u0131 olarak tan\u0131mlar. Her bir varl\u0131k s\u0131n\u0131f\u0131 (\u00f6rne\u011fin, <code>Ogrenci.java<\/code>) i\u00e7in ayr\u0131 bir <code>.hbm.xml<\/code> dosyas\u0131 olu\u015fturulur. Bu dosyalar, bir s\u0131n\u0131f\u0131n hangi tabloya e\u015flendi\u011fini, hangi \u00f6zelliklerinin hangi s\u00fctunlara kar\u015f\u0131l\u0131k geldi\u011fini, birincil anahtarlar\u0131n nas\u0131l y\u00f6netilece\u011fini ve ili\u015fkisel verileri (\u00f6rne\u011fin, bire-\u00e7ok, \u00e7oka-\u00e7ok ili\u015fkiler) nas\u0131l y\u00f6netece\u011fini belirtir.<\/p>\n<ul>\n<li><strong><code><class><\/code> Etiketi:<\/strong> Bu, e\u015flemenin temelidir. <code>name<\/code> \u00f6zelli\u011fi Java s\u0131n\u0131f\u0131n\u0131n tam nitelikli ad\u0131n\u0131 (paket ad\u0131yla birlikte), <code>table<\/code> \u00f6zelli\u011fi ise veritaban\u0131ndaki tablo ad\u0131n\u0131 belirtir.<\/li>\n<li><strong><code><id><\/code> Etiketi:<\/strong> Birincil anahtar\u0131 (primary key) tan\u0131mlar. <code>name<\/code> \u00f6zelli\u011fi Java s\u0131n\u0131f\u0131ndaki birincil anahtar alan\u0131n\u0131, <code>column<\/code> \u00f6zelli\u011fi ise veritaban\u0131 tablosundaki kar\u015f\u0131l\u0131k gelen s\u00fctun ad\u0131n\u0131 g\u00f6sterir. Ayr\u0131ca, anahtar\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 (\u00f6rne\u011fin, otomatik artan, UUID) belirten bir <code><generator><\/code> etiketi i\u00e7erir.<\/li>\n<li><strong><code><property><\/code> Etiketi:<\/strong> Varl\u0131k s\u0131n\u0131f\u0131ndaki di\u011fer \u00f6zelliklerin (alanlar\u0131n) veritaban\u0131 tablosundaki s\u00fctunlara nas\u0131l e\u015flendi\u011fini tan\u0131mlar. <code>name<\/code> \u00f6zelli\u011fi Java s\u0131n\u0131f\u0131ndaki alan ad\u0131n\u0131, <code>column<\/code> \u00f6zelli\u011fi ise veritaban\u0131 tablosundaki s\u00fctun ad\u0131n\u0131 belirtir. Ayr\u0131ca, <code>type<\/code>, <code>length<\/code>, <code>not-null<\/code> gibi ek nitelikler de tan\u0131mlanabilir.<\/li>\n<\/ul>\n<p><code>Configuration<\/code> s\u0131n\u0131f\u0131, Hibernate uygulamas\u0131n\u0131 ba\u015flatmak i\u00e7in kullan\u0131lan ilk s\u0131n\u0131ft\u0131r. Bu s\u0131n\u0131f, <code>hibernate.cfg.xml<\/code> dosyas\u0131n\u0131 okuyarak t\u00fcm yap\u0131land\u0131rma bilgilerini y\u00fckler ve bir <code>SessionFactory<\/code> \u00f6rne\u011fi olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. T\u00fcm bu XML temelli yap\u0131land\u0131rma, Hibernate&#8217;\u0131n kodunuzdan tamamen ba\u011f\u0131ms\u0131z bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar, bu da uygulaman\u0131z\u0131n esnekli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131r\u0131r. Geli\u015ftiriciler, veritaban\u0131 \u015femas\u0131nda bir de\u011fi\u015fiklik oldu\u011funda sadece XML dosyas\u0131n\u0131 g\u00fcncelleyerek bu de\u011fi\u015fiklikleri kolayca uygulayabilirler. Bu temel prensipleri anlad\u0131\u011f\u0131m\u0131zda, Hibernate ile verimli bir \u015fekilde \u00e7al\u0131\u015fmaya ba\u015flayabiliriz.<\/p>\n<h2>Ad\u0131m Ad\u0131m Uygulama: Hibernate XML Konfig\u00fcrasyonu Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>\u015eimdi teorik bilgileri prati\u011fe d\u00f6kme zaman\u0131! Hibernate ile XML tabanl\u0131 bir veritaban\u0131 uygulamas\u0131 geli\u015ftirmek i\u00e7in ad\u0131m ad\u0131m ilerleyece\u011fiz. Bu b\u00f6l\u00fcm, s\u0131f\u0131rdan bir proje olu\u015fturmaktan, veritaban\u0131 e\u015flemelerini yapmaya ve ilk veritaban\u0131 i\u015flemlerini ger\u00e7ekle\u015ftirmeye kadar t\u00fcm s\u00fcreci kapsayacakt\u0131r.<\/p>\n<h3>Proje Kurulumu: Maven Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Nas\u0131l Eklenir?<\/h3>\n<p>\u0130lk olarak, basit bir Maven projesi olu\u015fturarak ba\u015fl\u0131yoruz. Maven, proje ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ve ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc y\u00f6netmek i\u00e7in harika bir ara\u00e7t\u0131r. Projemizin <code>pom.xml<\/code> dosyas\u0131na gerekli Hibernate ve veritaban\u0131 s\u00fcr\u00fcc\u00fcs\u00fc ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 eklemeliyiz. Bu \u00f6rnekte MySQL veritaban\u0131n\u0131 kullanaca\u011f\u0131m\u0131z\u0131 varsayal\u0131m. E\u011fer farkl\u0131 bir veritaban\u0131 (\u00f6rne\u011fin PostgreSQL, H2) kullan\u0131yorsan\u0131z, ilgili JDBC s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc eklemeniz yeterlidir. Ayr\u0131ca, Hibernate&#8217;\u0131n loglama yapabilmesi i\u00e7in SLF4J ve Logback ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 da eklemek iyi bir uygulamad\u0131r, bu sayede uygulaman\u0131z\u0131n ne yapt\u0131\u011f\u0131n\u0131 konsoldan veya bir dosyadan takip edebilirsiniz.<\/p>\n<pre><code>\n<project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\n         xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0<\/modelVersion>\n    <groupId>com.example<\/groupId>\n    <artifactId>hibernate-xml-example<\/artifactId>\n    <version>1.0-SNAPSHOT<\/version>\n    <properties>\n        <maven.compiler.source>11<\/maven.compiler.source>\n        <maven.compiler.target>11<\/maven.compiler.target>\n    <\/properties>\n    <dependencies>\n        <!-- Hibernate Core -->\n        <dependency>\n            <groupId>org.hibernate<\/groupId>\n            <artifactId>hibernate-core<\/artifactId>\n            <version>5.6.15.Final<\/version> <!-- G\u00fcncel s\u00fcr\u00fcm\u00fc kontrol edin -->\n        <\/dependency>\n        <!-- MySQL Driver -->\n        <dependency>\n            <groupId>mysql<\/groupId>\n            <artifactId>mysql-connector-java<\/artifactId>\n            <version>8.0.33<\/version> <!-- G\u00fcncel s\u00fcr\u00fcm\u00fc kontrol edin -->\n        <\/dependency>\n        <!-- Logging (SLF4J & Logback) -->\n        <dependency>\n            <groupId>org.slf4j<\/groupId>\n            <artifactId>slf4j-api<\/artifactId>\n            <version>1.7.36<\/version>\n        <\/dependency>\n        <dependency>\n            <groupId>ch.qos.logback<\/groupId>\n            <artifactId>logback-classic<\/artifactId>\n            <version>1.2.11<\/version>\n        <\/dependency>\n    <\/dependencies>\n<\/project>\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 ekledikten sonra Maven projenizi g\u00fcncellemeyi unutmay\u0131n. Art\u0131k Hibernate'\u0131 kullanmaya haz\u0131r\u0131z.<\/p>\n<h3>Varl\u0131k S\u0131n\u0131f\u0131 Olu\u015fturma: Basit Bir POJO Nas\u0131l Tan\u0131mlan\u0131r?<\/h3>\n<p>Hibernate ile \u00e7al\u0131\u015f\u0131rken, veritaban\u0131 tablolar\u0131n\u0131zdaki her bir sat\u0131r\u0131 temsil edecek Java POJO'lar\u0131 (Plain Old Java Objects) tan\u0131mlar\u0131z. Bu nesnelere genellikle \"Varl\u0131k S\u0131n\u0131flar\u0131\" (Entity Classes) denir. \u00d6rne\u011fimiz i\u00e7in basit bir <code>Ogrenci<\/code> s\u0131n\u0131f\u0131 olu\u015ftural\u0131m. Bu s\u0131n\u0131f, \u00f6\u011frencinin ID'si, ad\u0131, soyad\u0131 ve ya\u015f\u0131 gibi \u00f6zelliklere sahip olacak. \u00d6nemli olan, bu s\u0131n\u0131fta bir parametresiz kurucu metot (default constructor) ve getter\/setter metotlar\u0131n\u0131n bulunmas\u0131d\u0131r, \u00e7\u00fcnk\u00fc Hibernate bu metotlar\u0131 kullanarak nesneleri olu\u015fturur ve \u00f6zelliklerini ayarlar.<\/p>\n<pre><code>\npackage com.example.model;\n\npublic class Ogrenci {\n    private int id;\n    private String ad;\n    private String soyad;\n    private int yas;\n\n    \/\/ Parametresiz kurucu metod (Hibernate i\u00e7in gerekli)\n    public Ogrenci() {\n    }\n\n    \/\/ Parametreli kurucu metod (kolayl\u0131k i\u00e7in)\n    public Ogrenci(String ad, String soyad, int yas) {\n        this.ad = ad;\n        this.soyad = soyad;\n        this.yas = yas;\n    }\n\n    \/\/ Getter ve Setter metotlar\u0131\n    public int getId() { return id; }\n    public void setId(int id) { this.id = id; }\n    public String getAd() { return ad; }\n    public void setAd(String ad) { this.ad = ad; }\n    public String getSoyad() { return soyad; }\n    public void setSoyad(String soyad) { this.soyad = soyad; }\n    public int getYas() { return yas; }\n    public void setYas(int yas) { this.yas = yas; }\n\n    @Override\n    public String toString() {\n        return \"Ogrenci{\" +\n               \"id=\" + id +\n               \", ad='\" + ad + '\\'' +\n               \", soyad='\" + soyad + '\\'' +\n               \", yas=\" + yas +\n               '}';\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<h3>Varl\u0131k E\u015fleme Dosyas\u0131 (<code>Ogrenci.hbm.xml<\/code>) Olu\u015fturma: E\u015flemeler Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>\u015eimdi <code>Ogrenci<\/code> s\u0131n\u0131f\u0131m\u0131z\u0131 veritaban\u0131ndaki bir tabloya e\u015fleyecek XML dosyas\u0131n\u0131 olu\u015fturaca\u011f\u0131z. Bu dosya, <code>src\/main\/resources\/com\/example\/model<\/code> dizini alt\u0131nda (Java paket yap\u0131s\u0131n\u0131 yans\u0131tacak \u015fekilde) <code>Ogrenci.hbm.xml<\/code> ad\u0131yla kaydedilmelidir. Bu dosya, <code>Ogrenci<\/code> s\u0131n\u0131f\u0131n\u0131n <code>ogrenciler<\/code> tablosuna nas\u0131l e\u015flenece\u011fini, <code>id<\/code> alan\u0131n\u0131n birincil anahtar oldu\u011funu ve otomatik olarak olu\u015fturulaca\u011f\u0131n\u0131, di\u011fer alanlar\u0131n ise ilgili s\u00fctunlara nas\u0131l kar\u015f\u0131l\u0131k geldi\u011fini belirtir.<\/p>\n<pre><code>\n<?xml version = \"1.0\" encoding = \"utf-8\"?>\n<!DOCTYPE hibernate-mapping PUBLIC\n        \"-\/\/Hibernate\/Hibernate Mapping DTD 3.0\/\/EN\"\n        \"http:\/\/www.hibernate.org\/dtd\/hibernate-mapping-3.0.dtd\">\n\n<hibernate-mapping>\n    <class name=\"com.example.model.Ogrenci\" table=\"ogrenciler\">\n        <id name=\"id\" type=\"int\" column=\"ogrenci_id\">\n            <generator class=\"native\"\/> <!-- Veritaban\u0131n\u0131n do\u011fal ID olu\u015fturma mekanizmas\u0131n\u0131 kullan -->\n        <\/id>\n        <property name=\"ad\" column=\"ogrenci_ad\" type=\"string\"\/>\n        <property name=\"soyad\" column=\"ogrenci_soyad\" type=\"string\"\/>\n        <property name=\"yas\" column=\"ogrenci_yas\" type=\"int\"\/>\n    <\/class>\n<\/hibernate-mapping>\n    <\/pre>\n<p><\/code><\/p>\n<p>Burada <code><generator class=\"native\"\/><\/code> ifadesi, Hibernate'\u0131n birincil anahtar de\u011ferini olu\u015fturmak i\u00e7in veritaban\u0131n\u0131n kendi otomatik art\u0131rma (auto-increment) mekanizmas\u0131n\u0131 kullanaca\u011f\u0131n\u0131 belirtir. \u00d6rne\u011fin, MySQL'de <code>AUTO_INCREMENT<\/code> \u00f6zelli\u011fini kullanacakt\u0131r.<\/p>\n<h3>Hibernate Konfig\u00fcrasyon Dosyas\u0131 (<code>hibernate.cfg.xml<\/code>): Ba\u011flant\u0131 ve Varl\u0131k E\u015fleme Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Son olarak, Hibernate'\u0131n genel yap\u0131land\u0131rma dosyas\u0131n\u0131 (<code>hibernate.cfg.xml<\/code>) olu\u015fturuyoruz. Bu dosya da <code>src\/main\/resources<\/code> klas\u00f6r\u00fc alt\u0131nda bulunmal\u0131d\u0131r. Bu dosyada veritaban\u0131 ba\u011flant\u0131 bilgilerini, diyalekti ve e\u015fleme dosyam\u0131z\u0131 belirtiyoruz. Bu konfig\u00fcrasyon, Hibernate'\u0131n veritaban\u0131na nas\u0131l ba\u011flanaca\u011f\u0131n\u0131 ve hangi POJO'lar\u0131n hangi veritaban\u0131 tablolar\u0131na e\u015flendi\u011fini anlamas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code>\n<?xml version = \"1.0\" encoding = \"utf-8\"?>\n<!DOCTYPE hibernate-configuration PUBLIC\n        \"-\/\/Hibernate\/Hibernate Configuration DTD 3.0\/\/EN\"\n        \"http:\/\/www.hibernate.org\/dtd\/hibernate-configuration-3.0.dtd\">\n\n<hibernate-configuration>\n    <session-factory>\n        <!-- Veritaban\u0131 ba\u011flant\u0131 ayarlar\u0131 -->\n        <property name=\"hibernate.connection.driver_class\">com.mysql.cj.jdbc.Driver<\/property>\n        <property name=\"hibernate.connection.url\">jdbc:mysql:\/\/localhost:3306\/hibernate_db?useSSL=false&serverTimezone=UTC<\/property>\n        <property name=\"hibernate.connection.username\">root<\/property>\n        <property name=\"hibernate.connection.password\">password<\/property>\n        <!-- MySQL 8 Diyalekt -->\n        <property name=\"hibernate.dialect\">org.hibernate.dialect.MySQL8Dialect<\/property>\n        <!-- SQL sorgular\u0131n\u0131 konsolda g\u00f6ster -->\n        <property name=\"show_sql\">true<\/property>\n        <!-- SQL sorgular\u0131n\u0131 formatla -->\n        <property name=\"format_sql\">true<\/property>\n        <!-- Otomatik \u015fema y\u00f6netimi (sadece geli\u015ftirme ortam\u0131 i\u00e7in \u00f6nerilir) -->\n        <property name=\"hibernate.hbm2ddl.auto\">update<\/property>\n        \n        <!-- E\u015fleme dosyas\u0131n\u0131 ekle -->\n        <mapping resource=\"com\/example\/model\/Ogrenci.hbm.xml\"\/>\n    <\/session-factory>\n<\/hibernate-configuration>\n    <\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: <code>hibernate.hbm2ddl.auto<\/code> \u00f6zelli\u011fini \u00fcretim ortamlar\u0131nda <code>validate<\/code> olarak veya tamamen devre d\u0131\u015f\u0131 b\u0131rakmay\u0131 unutmay\u0131n. <code>create<\/code> veya <code>update<\/code> kullanmak veri kayb\u0131na yol a\u00e7abilir veya \u015femay\u0131 beklenmedik \u015fekilde de\u011fi\u015ftirebilir.\n    <\/div>\n<p>T\u00fcm bu ad\u0131mlar\u0131 tamamlad\u0131\u011f\u0131m\u0131zda, Hibernate projemizin temelini atm\u0131\u015f oluyoruz. Bir sonraki b\u00f6l\u00fcmde, bu konfig\u00fcrasyonu kullanarak veritaban\u0131 i\u015flemlerini nas\u0131l ger\u00e7ekle\u015ftirece\u011fimize odaklanaca\u011f\u0131z.<\/p>\n<h2>Hibernate Oturumlar\u0131 ve Veritaban\u0131 \u0130\u015flemleri Nas\u0131l Y\u00f6netilir?<\/h2>\n<p>Hibernate'\u0131n t\u00fcm konfig\u00fcrasyonunu tamamlad\u0131ktan sonra, s\u0131ra geldi uygulamam\u0131zda veritaban\u0131 i\u015flemlerini ger\u00e7ekle\u015ftirmeye. Bu b\u00f6l\u00fcm, <code>SessionFactory<\/code> ve <code>Session<\/code> gibi temel Hibernate kavramlar\u0131n\u0131 ve CRUD (Create, Read, Update, Delete) operasyonlar\u0131n\u0131 nas\u0131l y\u00f6netece\u011fimizi a\u00e7\u0131klayacakt\u0131r.<\/p>\n<h3>SessionFactory ve Session Aras\u0131ndaki Fark\u0131 Anlamak<\/h3>\n<p>Hibernate mimarisinin kalbinde iki \u00f6nemli kavram bulunur: <code>SessionFactory<\/code> ve <code>Session<\/code>.<\/p>\n<ul>\n<li><strong><code>SessionFactory<\/code>:<\/strong> Ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, <code>SessionFactory<\/code> bir <code>Session<\/code> (Oturum) \u00fcretmekten sorumlu olan bir fabrikad\u0131r. <code>hibernate.cfg.xml<\/code> dosyas\u0131ndaki t\u00fcm yap\u0131land\u0131rma bilgilerini (veritaban\u0131 ba\u011flant\u0131 detaylar\u0131, e\u015fleme dosyalar\u0131 vb.) i\u00e7erir. Uygulama ba\u015flat\u0131ld\u0131\u011f\u0131nda sadece bir kez olu\u015fturulur ve t\u00fcm uygulama ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca yeniden kullan\u0131l\u0131r. \u00c7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 (thread-safe) destekler, bu nedenle farkl\u0131 i\u015f par\u00e7ac\u0131klar\u0131 ayn\u0131 <code>SessionFactory<\/code> \u00f6rne\u011fini g\u00fcvenle kullanabilir. A\u011f\u0131r bir kaynak oldu\u011fundan, uygulaman\u0131n ba\u015flang\u0131c\u0131nda olu\u015fturulup \u00f6nbelle\u011fe al\u0131nmas\u0131 en iyi pratiktir.<\/li>\n<li><strong><code>Session<\/code>:<\/strong> <code>Session<\/code>, Hibernate ile veritaban\u0131 aras\u0131nda bir ara y\u00fcz g\u00f6revi g\u00f6r\u00fcr. Her bir veritaban\u0131 i\u015flemi (bir nesneyi kaydetme, okuma, g\u00fcncelleme veya silme) i\u00e7in bir <code>Session<\/code> \u00f6rne\u011fi kullan\u0131l\u0131r. Bir <code>Session<\/code>, genellikle bir i\u015f birimiyle (unit of work) veya tek bir veritaban\u0131 etkile\u015fimiyle ili\u015fkilidir. <code>Session<\/code> nesneleri i\u015f par\u00e7ac\u0131\u011f\u0131 g\u00fcvenli de\u011fildir, bu nedenle her yeni istek veya i\u015flem i\u00e7in yeni bir <code>Session<\/code> olu\u015fturulmal\u0131 ve i\u015f bittikten sonra kapat\u0131lmal\u0131d\u0131r. Bir <code>Session<\/code>, \u00f6nbellek g\u00f6revi de g\u00f6r\u00fcr (first-level cache), bu da ayn\u0131 oturum i\u00e7inde tekrarlanan sorgular\u0131n performans\u0131n\u0131 art\u0131r\u0131r.<\/li>\n<\/ul>\n<h3>Veri Ekleme, Okuma, G\u00fcncelleme, Silme (CRUD) \u0130\u015flemleri<\/h3>\n<p>\u015eimdi bir <code>HibernateUtil<\/code> s\u0131n\u0131f\u0131 olu\u015fturarak <code>SessionFactory<\/code>'mizi ba\u015flat\u0131p <code>Session<\/code> nesnelerini kolayca elde edelim. Daha sonra ana uygulamam\u0131zda CRUD i\u015flemlerini ger\u00e7ekle\u015ftirelim.<\/p>\n<h4><code>HibernateUtil<\/code> S\u0131n\u0131f\u0131<\/h4>\n<p>Bu s\u0131n\u0131f, <code>SessionFactory<\/code>'yi ba\u015flatmak ve uygulamada tekil bir \u00f6rnek olarak tutmak i\u00e7in kullan\u0131l\u0131r. Bu sayede, her yerde ayn\u0131 yap\u0131land\u0131rmay\u0131 kullanabiliriz.<\/p>\n<pre><code>\npackage com.example.util;\n\nimport org.hibernate.SessionFactory;\nimport org.hibernate.cfg.Configuration;\n\npublic class HibernateUtil {\n\n    private static final SessionFactory sessionFactory = buildSessionFactory();\n\n    private static SessionFactory buildSessionFactory() {\n        try {\n            \/\/ hibernate.cfg.xml dosyas\u0131n\u0131 y\u00fckler ve SessionFactory olu\u015fturur\n            return new Configuration().configure(\"hibernate.cfg.xml\").buildSessionFactory();\n        } catch (Throwable ex) {\n            System.err.println(\"SessionFactory olu\u015fturulamad\u0131: \" + ex);\n            throw new ExceptionInInitializerError(ex);\n        }\n    }\n\n    public static SessionFactory getSessionFactory() {\n        return sessionFactory;\n    }\n\n    public static void shutdown() {\n        \/\/ Uygulama kapan\u0131rken SessionFactory'yi kapat\u0131r\n        getSessionFactory().close();\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<h4>\u00d6rnek Kod: Basit Bir <code>Main<\/code> S\u0131n\u0131f\u0131 ile CRUD \u0130\u015flemleri<\/h4>\n<p>Art\u0131k <code>HibernateUtil<\/code>'i kullanarak <code>Ogrenci<\/code> varl\u0131klar\u0131 \u00fczerinde temel CRUD operasyonlar\u0131n\u0131 yapabiliriz.<\/p>\n<pre><code>\npackage com.example.app;\n\nimport com.example.model.Ogrenci;\nimport com.example.util.HibernateUtil;\nimport org.hibernate.Session;\nimport org.hibernate.Transaction;\nimport org.hibernate.query.Query;\n\nimport java.util.List;\n\npublic class MainApp {\n\n    public static void main(String[] args) {\n        \/\/ Yeni \u00f6\u011frenci olu\u015fturma\n        System.out.println(\"Yeni \u00f6\u011frenci ekleniyor...\");\n        Ogrenci ogrenci1 = new Ogrenci(\"Ay\u015fe\", \"Y\u0131lmaz\", 20);\n        saveOgrenci(ogrenci1);\n        System.out.println(\"Eklenen \u00d6\u011frenci: \" + ogrenci1);\n\n        Ogrenci ogrenci2 = new Ogrenci(\"Mehmet\", \"Demir\", 22);\n        saveOgrenci(ogrenci2);\n        System.out.println(\"Eklenen \u00d6\u011frenci: \" + ogrenci2);\n\n        \/\/ \u00d6\u011frenci okuma\n        System.out.println(\"\\nT\u00fcm \u00f6\u011frenciler listeleniyor...\");\n        List<Ogrenci> ogrenciler = getAllOgrenciler();\n        ogrenciler.forEach(System.out::println);\n\n        \/\/ Bir \u00f6\u011frenciyi ID ile bulma\n        System.out.println(\"\\nID=1 olan \u00f6\u011frenci aran\u0131yor...\");\n        Ogrenci bulunanOgrenci = getOgrenciById(1);\n        if (bulunanOgrenci != null) {\n            System.out.println(\"Bulunan \u00d6\u011frenci: \" + bulunanOgrenci);\n            \/\/ \u00d6\u011frenci g\u00fcncelleme\n            System.out.println(\"\\n\u00d6\u011frenci g\u00fcncelleniyor...\");\n            bulunanOgrenci.setYas(21);\n            updateOgrenci(bulunanOgrenci);\n            System.out.println(\"G\u00fcncellenen \u00d6\u011frenci: \" + getOgrenciById(1));\n        } else {\n            System.out.println(\"ID=1 olan \u00f6\u011frenci bulunamad\u0131.\");\n        }\n\n        \/\/ \u00d6\u011frenci silme\n        if (ogrenci2.getId() != 0) {\n            System.out.println(\"\\nID=\" + ogrenci2.getId() + \" olan \u00f6\u011frenci siliniyor...\");\n            deleteOgrenci(ogrenci2.getId());\n            System.out.println(\"Silme sonras\u0131 t\u00fcm \u00f6\u011frenciler:\");\n            getAllOgrenciler().forEach(System.out::println);\n        }\n\n        \/\/ SessionFactory'yi kapat\n        HibernateUtil.shutdown();\n    }\n\n    private static void saveOgrenci(Ogrenci ogrenci) {\n        Transaction transaction = null;\n        try (Session session = HibernateUtil.getSessionFactory().openSession()) {\n            transaction = session.beginTransaction();\n            session.save(ogrenci); \/\/ Veritaban\u0131na kaydet\n            transaction.commit();\n        } catch (Exception e) {\n            if (transaction != null) {\n                transaction.rollback();\n            }\n            e.printStackTrace();\n        }\n    }\n\n    private static Ogrenci getOgrenciById(int id) {\n        try (Session session = HibernateUtil.getSessionFactory().openSession()) {\n            return session.get(Ogrenci.class, id); \/\/ ID ile nesneyi getir\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n\n    private static List<Ogrenci> getAllOgrenciler() {\n        try (Session session = HibernateUtil.getSessionFactory().openSession()) {\n            \/\/ HQL (Hibernate Query Language) kullanarak t\u00fcm \u00f6\u011frencileri getir\n            Query<Ogrenci> query = session.createQuery(\"FROM Ogrenci\", Ogrenci.class);\n            return query.list();\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n\n    private static void updateOgrenci(Ogrenci ogrenci) {\n        Transaction transaction = null;\n        try (Session session = HibernateUtil.getSessionFactory().openSession()) {\n            transaction = session.beginTransaction();\n            session.update(ogrenci); \/\/ Nesneyi g\u00fcncelle\n            transaction.commit();\n        } catch (Exception e) {\n            if (transaction != null) {\n                transaction.rollback();\n            }\n            e.printStackTrace();\n        }\n    }\n\n    private static void deleteOgrenci(int id) {\n        Transaction transaction = null;\n        try (Session session = HibernateUtil.getSessionFactory().openSession()) {\n            transaction = session.beginTransaction();\n            Ogrenci ogrenci = session.get(Ogrenci.class, id);\n            if (ogrenci != null) {\n                session.delete(ogrenci); \/\/ Nesneyi sil\n            }\n            transaction.commit();\n        } catch (Exception e) {\n            if (transaction != null) {\n                transaction.rollback();\n            }\n            e.printStackTrace();\n        }\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu kod blo\u011fu, Hibernate ile bir <code>Ogrenci<\/code> nesnesinin nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131, okunaca\u011f\u0131n\u0131, g\u00fcncellenece\u011fini ve silinece\u011fini g\u00f6stermektedir. Her i\u015flem i\u00e7in bir <code>Session<\/code> a\u00e7\u0131l\u0131r, bir <code>Transaction<\/code> ba\u015flat\u0131l\u0131r, i\u015flem yap\u0131l\u0131r ve <code>Transaction<\/code> commit edilir. Hata durumunda rollback yap\u0131l\u0131r ve kaynaklar (session) try-with-resources ile otomatik olarak kapat\u0131l\u0131r. Bu yap\u0131, g\u00fcvenli ve hatas\u0131z veritaban\u0131 i\u015flemleri i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h2>Geli\u015fmi\u015f Konfig\u00fcrasyon Se\u00e7enekleri ve \u0130pu\u00e7lar\u0131 Nelerdir?<\/h2>\n<p>Hibernate'\u0131n temel i\u015flevselli\u011fi, \u00e7o\u011fu uygulaman\u0131n ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lasa da, b\u00fcy\u00fck \u00f6l\u00e7ekli ve y\u00fcksek performansl\u0131 sistemler i\u00e7in baz\u0131 geli\u015fmi\u015f konfig\u00fcrasyon ve optimizasyon teknikleri uygulamak gerekebilir. Bu b\u00f6l\u00fcmde, Hibernate'\u0131n XML tabanl\u0131 yap\u0131land\u0131rmas\u0131 \u00fczerinden eri\u015febilece\u011finiz baz\u0131 \u00f6nemli ileri d\u00fczey \u00f6zelliklere ve ipu\u00e7lar\u0131na de\u011finece\u011fiz.<\/p>\n<h3>Ba\u011flant\u0131 Havuzu (Connection Pooling) Nas\u0131l Kullan\u0131l\u0131r?<\/h3>\n<p>Her veritaban\u0131 i\u015flemi i\u00e7in yeni bir JDBC ba\u011flant\u0131s\u0131 a\u00e7mak ve kapatmak, \u00f6zellikle y\u00fcksek y\u00fck alt\u0131ndaki uygulamalarda ciddi bir performans darbo\u011faz\u0131 olu\u015fturur. Ba\u011flant\u0131 kurma s\u00fcreci kaynak yo\u011fundur ve maliyetlidir. \u0130\u015fte bu y\u00fczden ba\u011flant\u0131 havuzlar\u0131 (Connection Pools) kullan\u0131l\u0131r. Bir ba\u011flant\u0131 havuzu, \u00f6nceden olu\u015fturulmu\u015f ve kullan\u0131ma haz\u0131r veritaban\u0131 ba\u011flant\u0131lar\u0131ndan olu\u015fan bir koleksiyon tutar. Bir uygulamaya ba\u011flant\u0131 gerekti\u011finde, havuzdan mevcut bir ba\u011flant\u0131 al\u0131n\u0131r ve i\u015fi bitti\u011finde havuza geri d\u00f6ner, kapat\u0131lmaz. Bu sayede ba\u011flant\u0131 olu\u015fturma ve kapatma maliyetinden ka\u00e7\u0131n\u0131l\u0131r.<\/p>\n<p>Hibernate, kendi basit ba\u011flant\u0131 havuzuna sahip olsa da, \u00fcretim ortamlar\u0131nda genellikle daha robust ve \u00f6zellikli \u00fc\u00e7\u00fcnc\u00fc parti havuzlar (\u00f6rne\u011fin, C3P0, HikariCP) tercih edilir. HikariCP, genellikle en h\u0131zl\u0131 ve en kararl\u0131 ba\u011flant\u0131 havuzlar\u0131ndan biri olarak kabul edilir.<\/p>\n<p>XML konfig\u00fcrasyonu \u00fczerinden bir ba\u011flant\u0131 havuzunu entegre etmek i\u00e7in <code>hibernate.cfg.xml<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki gibi \u00f6zellikler ekleyebilirsiniz (C3P0 \u00f6rne\u011fi):<\/p>\n<pre><code>\n<!-- C3P0 Ba\u011flant\u0131 Havuzu Ayarlar\u0131 -->\n<property name=\"hibernate.connection.provider_class\">org.hibernate.connection.C3P0ConnectionProvider<\/property>\n<property name=\"hibernate.c3p0.min_size\">5<\/property>\n<property name=\"hibernate.c3p0.max_size\">20<\/property>\n<property name=\"hibernate.c3p0.timeout\">300<\/property>\n<property name=\"hibernate.c3p0.max_statements\">50<\/property>\n<property name=\"hibernate.c3p0.idle_test_period\">3000<\/property>\n    <\/pre>\n<p><\/code><\/p>\n<p>C3P0 veya HikariCP kullan\u0131yorsan\u0131z, <code>pom.xml<\/code> dosyan\u0131za ilgili Maven ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 eklemeyi unutmay\u0131n.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: HikariCP, genellikle C3P0'dan daha iyi performans g\u00f6sterir. HikariCP'yi entegre etmek i\u00e7in genellikle <code>hibernate.cfg.xml<\/code> yerine programatik konfig\u00fcrasyon veya Spring gibi bir \u00e7at\u0131 kullanmak daha yayg\u0131nd\u0131r, ancak temel JDBC ba\u011flant\u0131 ayarlar\u0131n\u0131z zaten havuz taraf\u0131ndan y\u00f6netilebilir.\n    <\/div>\n<h3>\u0130kinci Seviye \u00d6nbellekleme (Second-Level Caching) Nas\u0131l Aktif Edilir?<\/h3>\n<p>Hibernate, performans art\u0131\u015f\u0131 sa\u011flamak i\u00e7in dahili olarak bir birinci seviye \u00f6nbelle\u011fe (first-level cache) sahiptir. Bu \u00f6nbellek, bir <code>Session<\/code> \u00f6mr\u00fc boyunca etkin olup, ayn\u0131 oturum i\u00e7inde tekrar eden sorgular\u0131n veritaban\u0131na gitmesini engeller. Ancak farkl\u0131 oturumlar aras\u0131nda veri payla\u015f\u0131m\u0131 veya ayn\u0131 sorgunun farkl\u0131 oturumlarda tekrar etmesi durumunda performans art\u0131\u015f\u0131 sa\u011flamaz.<\/p>\n<p>\u0130\u015fte bu noktada ikinci seviye \u00f6nbellek (second-level cache) devreye girer. \u0130kinci seviye \u00f6nbellek, <code>SessionFactory<\/code> d\u00fczeyinde \u00e7al\u0131\u015f\u0131r ve farkl\u0131 oturumlar aras\u0131nda payla\u015f\u0131lan verileri depolar. Bu, ayn\u0131 varl\u0131\u011f\u0131n birden fazla oturum taraf\u0131ndan s\u0131k\u00e7a sorguland\u0131\u011f\u0131 durumlarda veritaban\u0131 trafi\u011fini ve sorgu y\u00fck\u00fcn\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azaltabilir.<\/p>\n<p>Hibernate, farkl\u0131 ikinci seviye \u00f6nbellek sa\u011flay\u0131c\u0131lar\u0131n\u0131 destekler (\u00f6rne\u011fin, Ehcache, Infinispan). Ehcache entegrasyonu i\u00e7in <code>hibernate.cfg.xml<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki ayarlar\u0131 ekleyebilirsiniz:<\/p>\n<pre><code>\n<!-- \u0130kinci Seviye \u00d6nbellek Ayarlar\u0131 -->\n<property name=\"hibernate.cache.use_second_level_cache\">true<\/property>\n<property name=\"hibernate.cache.region.factory_class\">org.hibernate.cache.ehcache.EhCacheRegionFactory<\/property>\n<property name=\"hibernate.cache.use_query_cache\">true<\/property> <!-- Sorgu \u00f6nbelle\u011fi i\u00e7in -->\n    <\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, \u00f6nbelle\u011fe almak istedi\u011finiz varl\u0131klar\u0131 <code>.hbm.xml<\/code> dosyalar\u0131n\u0131zda belirtmelisiniz:<\/p>\n<pre><code>\n<hibernate-mapping>\n    <class name=\"com.example.model.Ogrenci\" table=\"ogrenciler\">\n        <cache usage=\"read-write\"\/> <!-- Varl\u0131k \u00f6nbelleklemesi -->\n        ...\n    <\/class>\n<\/hibernate-mapping>\n    <\/pre>\n<p><\/code><\/p>\n<p><code><cache usage=\"...\"\/><\/code> etiketi ile \u00f6nbellekleme stratejisini belirtirsiniz (<code>read-only<\/code>, <code>read-write<\/code>, <code>nonstrict-read-write<\/code>, <code>transactional<\/code>). Ehcache ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 <code>pom.xml<\/code>'e eklemeyi unutmay\u0131n.<\/p>\n<h3>Hata Y\u00f6netimi ve Loglama Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Bir uygulaman\u0131n g\u00fcvenilirli\u011fi ve bak\u0131m\u0131 i\u00e7in do\u011fru hata y\u00f6netimi ve kapsaml\u0131 loglama hayati \u00f6neme sahiptir. Hibernate, dahili olarak SLF4J (Simple Logging Facade for Java) kullan\u0131r, bu da pop\u00fcler loglama k\u00fct\u00fcphaneleri (Logback, Log4j2) ile kolayca entegre edilebilece\u011fi anlam\u0131na gelir.<\/p>\n<p>Yukar\u0131daki Maven ba\u011f\u0131ml\u0131l\u0131klar\u0131 b\u00f6l\u00fcm\u00fcnde zaten SLF4J ve Logback'i eklemi\u015ftik. Logback'i yap\u0131land\u0131rmak i\u00e7in <code>src\/main\/resources<\/code> dizini alt\u0131na <code>logback.xml<\/code> ad\u0131nda bir dosya olu\u015fturabilirsiniz. Bu dosya, log seviyelerini, \u00e7\u0131kt\u0131 hedeflerini (konsol, dosya) ve format\u0131n\u0131 belirlemenizi sa\u011flar.<\/p>\n<pre><code>\n<configuration>\n    <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n<\/pattern>\n        <\/encoder>\n    <\/appender>\n\n    <logger name=\"org.hibernate\" level=\"WARN\"\/> <!-- Hibernate log seviyesi -->\n    <logger name=\"org.hibernate.SQL\" level=\"DEBUG\"\/> <!-- SQL sorgular\u0131n\u0131 g\u00f6sterir -->\n    <logger name=\"org.hibernate.type.descriptor.sql\" level=\"TRACE\"\/> <!-- SQL parametrelerini g\u00f6sterir -->\n\n    <root level=\"info\">\n        <appender-ref ref=\"STDOUT\" \/>\n    <\/root>\n<\/configuration>\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu <code>logback.xml<\/code> ayar\u0131, Hibernate'\u0131n ve SQL sorgular\u0131n\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 konsola y\u00f6nlendirir. <code>hibernate.show_sql=true<\/code> \u00f6zelli\u011fini kullanmasan\u0131z bile <code>org.hibernate.SQL<\/code> logger'\u0131n\u0131 DEBUG seviyesine ayarlayarak SQL sorgular\u0131n\u0131 g\u00f6rebilirsiniz. <code>org.hibernate.type.descriptor.sql<\/code> logger'\u0131n\u0131 TRACE seviyesine ayarlamak, y\u00fcr\u00fct\u00fclen SQL sorgular\u0131ndaki parametreleri (<code>?<\/code> yerine ge\u00e7en ger\u00e7ek de\u011ferler) g\u00f6rmenizi sa\u011flar, bu da hata ay\u0131klama i\u00e7in son derece faydal\u0131d\u0131r.<\/p>\n<p>Bu ileri d\u00fczey konfig\u00fcrasyon se\u00e7enekleri, uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131rman\u0131za, kaynaklar\u0131 daha verimli kullanman\u0131za ve sorun giderme s\u00fcre\u00e7lerini kolayla\u015ft\u0131rman\u0131za olanak tan\u0131r. Her bir \u00f6zelli\u011fi dikkatlice de\u011ferlendirerek ve test ederek uygulaman\u0131z\u0131n \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re optimize etmelisiniz.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Bir E-Ticaret Uygulamas\u0131nda \u00dcr\u00fcn Y\u00f6netimi<\/h2>\n<p>\u015eimdi \u00f6\u011frendiklerimizi daha karma\u015f\u0131k, ger\u00e7ek d\u00fcnya benzeri bir senaryoda uygulayal\u0131m: Basit bir e-ticaret uygulamas\u0131nda \u00fcr\u00fcn ve kategori y\u00f6netimi. Bu senaryo, birden \u00e7ok varl\u0131k s\u0131n\u0131f\u0131n\u0131n nas\u0131l tan\u0131mland\u0131\u011f\u0131n\u0131 ve aralar\u0131ndaki bire-\u00e7ok (One-to-Many) gibi ili\u015fkilerin XML tabanl\u0131 Hibernate konfig\u00fcrasyonu ile nas\u0131l e\u015flendi\u011fini g\u00f6sterecektir.<\/p>\n<h3>Varl\u0131k Tan\u0131mlar\u0131: <code>Kategori<\/code> ve <code>Urun<\/code><\/h3>\n<p>Bir e-ticaret uygulamas\u0131nda genellikle \u00fcr\u00fcnler kategorilere ayr\u0131l\u0131r. Her kategorinin birden fazla \u00fcr\u00fcn\u00fc olabilir, ancak her \u00fcr\u00fcn yaln\u0131zca bir kategoriye aittir. Bu, tipik bir bire-\u00e7ok ili\u015fkisidir.<\/p>\n<h4><code>Kategori.java<\/code> S\u0131n\u0131f\u0131<\/h4>\n<p>\u0130lk olarak, kategorileri temsil edecek <code>Kategori<\/code> s\u0131n\u0131f\u0131n\u0131 olu\u015ftural\u0131m. Bir kategorinin bir ID'si, ad\u0131 ve bu kategoriye ait \u00fcr\u00fcnlerin bir listesi olacakt\u0131r.<\/p>\n<pre><code>\npackage com.example.model;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\npublic class Kategori {\n    private int id;\n    private String ad;\n    private Set<Urun> urunler = new HashSet<>(0); \/\/ Bire-\u00e7ok ili\u015fki i\u00e7in\n\n    public Kategori() {}\n\n    public Kategori(String ad) {\n        this.ad = ad;\n    }\n\n    \/\/ Getter ve Setter metotlar\u0131\n    public int getId() { return id; }\n    public void setId(int id) { this.id = id; }\n    public String getAd() { return ad; }\n    public void setAd(String ad) { this.ad = ad; }\n    public Set<Urun> getUrunler() { return urunler; }\n    public void setUrunler(Set<Urun> urunler) { this.urunler = urunler; }\n\n    \/\/ Yard\u0131mc\u0131 metot\n    public void addUrun(Urun urun) {\n        this.urunler.add(urun);\n        urun.setKategori(this);\n    }\n\n    @Override\n    public String toString() {\n        return \"Kategori{\" +\n               \"id=\" + id +\n               \", ad='\" + ad + '\\'' +\n               '}';\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<h4><code>Urun.java<\/code> S\u0131n\u0131f\u0131<\/h4>\n<p>Ard\u0131ndan, \u00fcr\u00fcnleri temsil edecek <code>Urun<\/code> s\u0131n\u0131f\u0131n\u0131 tan\u0131mlayal\u0131m. Bir \u00fcr\u00fcn\u00fcn bir ID'si, ad\u0131, fiyat\u0131 ve ait oldu\u011fu <code>Kategori<\/code> nesnesi olacakt\u0131r.<\/p>\n<pre><code>\npackage com.example.model;\n\npublic class Urun {\n    private int id;\n    private String ad;\n    private double fiyat;\n    private Kategori kategori; \/\/ \u00dcr\u00fcn\u00fcn ait oldu\u011fu kategori (\u00c7oktan-Bire ili\u015fki)\n\n    public Urun() {}\n\n    public Urun(String ad, double fiyat, Kategori kategori) {\n        this.ad = ad;\n        this.fiyat = fiyat;\n        this.kategori = kategori;\n    }\n\n    \/\/ Getter ve Setter metotlar\u0131\n    public int getId() { return id; }\n    public void setId(int id) { this.id = id; }\n    public String getAd() { return ad; }\n    public void setAd(String ad) { this.ad = ad; }\n    public double getFiyat() { return fiyat; }\n    public void setFiyat(double fiyat) { this.fiyat = fiyat; }\n    public Kategori getKategori() { return kategori; }\n    public void setKategori(Kategori kategori) { this.kategori = kategori; }\n\n    @Override\n    public String toString() {\n        return \"Urun{\" +\n               \"id=\" + id +\n               \", ad='\" + ad + '\\'' +\n               \", fiyat=\" + fiyat +\n               \", kategori=\" + (kategori != null ? kategori.getAd() : \"Yok\") +\n               '}';\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<h3>XML E\u015flemeleri: \u0130li\u015fkileri Tan\u0131mlama<\/h3>\n<p>\u015eimdi bu iki s\u0131n\u0131f\u0131 ve aralar\u0131ndaki ili\u015fkiyi XML ile e\u015fleyelim.<\/p>\n<h4><code>Kategori.hbm.xml<\/code> Dosyas\u0131<\/h4>\n<p><code>Kategori<\/code> i\u00e7in e\u015fleme dosyas\u0131, <code>urunler<\/code> koleksiyonunu <code><set><\/code> etiketiyle tan\u0131mlayarak bire-\u00e7ok ili\u015fkisini kurar.<\/p>\n<pre><code>\n<?xml version = \"1.0\" encoding = \"utf-8\"?>\n<!DOCTYPE hibernate-mapping PUBLIC\n        \"-\/\/Hibernate\/Hibernate Mapping DTD 3.0\/\/EN\"\n        \"http:\/\/www.hibernate.org\/dtd\/hibernate-mapping-3.0.dtd\">\n\n<hibernate-mapping>\n    <class name=\"com.example.model.Kategori\" table=\"kategoriler\">\n        <id name=\"id\" type=\"int\" column=\"kategori_id\">\n            <generator class=\"native\"\/>\n        <\/id>\n        <property name=\"ad\" column=\"kategori_ad\" type=\"string\"\/>\n\n        <!-- Bire-\u00c7ok ili\u015fki tan\u0131m\u0131 -->\n        <set name=\"urunler\" table=\"urunler\"\n             inverse=\"true\" lazy=\"true\" fetch=\"select\">\n            <key>\n                <column name=\"kategori_id\" not-null=\"true\"\/>\n            <\/key>\n            <one-to-many class=\"com.example.model.Urun\"\/>\n        <\/set>\n    <\/class>\n<\/hibernate-mapping>\n    <\/pre>\n<p><\/code><\/p>\n<p><code>inverse=\"true\"<\/code>, ili\u015fkinin <code>Urun<\/code> taraf\u0131nda y\u00f6netildi\u011fini belirtir. <code>lazy=\"true\"<\/code>, \u00fcr\u00fcnlerin sadece ihtiya\u00e7 duyuldu\u011funda y\u00fcklenece\u011fini sa\u011flar.<\/p>\n<h4><code>Urun.hbm.xml<\/code> Dosyas\u0131<\/h4>\n<p><code>Urun<\/code> i\u00e7in e\u015fleme dosyas\u0131, <code>kategori<\/code> alan\u0131n\u0131 <code><many-to-one><\/code> etiketiyle tan\u0131mlayarak \u00e7oktan-bire ili\u015fkisini kurar.<\/p>\n<pre><code>\n<?xml version = \"1.0\" encoding = \"utf-8\"?>\n<!DOCTYPE hibernate-mapping PUBLIC\n        \"-\/\/Hibernate\/Hibernate Mapping DTD 3.0\/\/EN\"\n        \"http:\/\/www.hibernate.org\/dtd\/hibernate-mapping-3.0.dtd\">\n\n<hibernate-mapping>\n    <class name=\"com.example.model.Urun\" table=\"urunler\">\n        <id name=\"id\" type=\"int\" column=\"urun_id\">\n            <generator class=\"native\"\/>\n        <\/id>\n        <property name=\"ad\" column=\"urun_ad\" type=\"string\"\/>\n        <property name=\"fiyat\" column=\"urun_fiyat\" type=\"double\"\/>\n\n        <!-- \u00c7oktan-Bire ili\u015fki tan\u0131m\u0131 -->\n        <many-to-one name=\"kategori\" class=\"com.example.model.Kategori\"\n                     column=\"kategori_id\" not-null=\"true\"\/>\n    <\/class>\n<\/hibernate-mapping>\n    <\/pre>\n<p><\/code><\/p>\n<p><code>column=\"kategori_id\"<\/code>, <code>urunler<\/code> tablosundaki yabanc\u0131 anahtar s\u00fctununu belirtir.<\/p>\n<h3><code>hibernate.cfg.xml<\/code> G\u00fcncellemesi<\/h3>\n<p>Yeni varl\u0131k e\u015fleme dosyalar\u0131m\u0131z\u0131 <code>hibernate.cfg.xml<\/code>'e eklemeyi unutmay\u0131n:<\/p>\n<pre><code>\n...\n<session-factory>\n    ...\n    <mapping resource=\"com\/example\/model\/Ogrenci.hbm.xml\"\/> <!-- E\u011fer kullanmaya devam ediyorsan\u0131z -->\n    <mapping resource=\"com\/example\/model\/Kategori.hbm.xml\"\/>\n    <mapping resource=\"com\/example\/model\/Urun.hbm.xml\"\/>\n<\/session-factory>\n...\n    <\/pre>\n<p><\/code><\/p>\n<h3>Senaryo: Yeni \u00dcr\u00fcn Ekleme ve Kategoriye G\u00f6re \u00dcr\u00fcn Listeleme<\/h3>\n<p>\u015eimdi <code>MainApp<\/code> s\u0131n\u0131f\u0131m\u0131zda bu ili\u015fkileri kullanarak nas\u0131l i\u015flem yapaca\u011f\u0131m\u0131za bakal\u0131m.<\/p>\n<pre><code>\npackage com.example.app;\n\nimport com.example.model.Kategori;\nimport com.example.model.Urun;\nimport com.example.util.HibernateUtil;\nimport org.hibernate.Session;\nimport org.hibernate.Transaction;\nimport org.hibernate.query.Query;\n\nimport java.util.List;\n\npublic class EcommerceApp {\n\n    public static void main(String[] args) {\n        \/\/ Yeni Kategori olu\u015fturma\n        Kategori elektronik = new Kategori(\"Elektronik\");\n        saveKategori(elektronik);\n        System.out.println(\"Eklenen Kategori: \" + elektronik);\n\n        Kategori giyim = new Kategori(\"Giyim\");\n        saveKategori(giyim);\n        System.out.println(\"Eklenen Kategori: \" + giyim);\n\n        \/\/ Yeni \u00dcr\u00fcnler olu\u015fturma ve kategoriye atama\n        Urun laptop = new Urun(\"Laptop\", 15000.00, elektronik);\n        Urun telefon = new Urun(\"Ak\u0131ll\u0131 Telefon\", 8000.00, elektronik);\n        Urun tshirt = new Urun(\"T-shirt\", 150.00, giyim);\n\n        saveUrun(laptop);\n        saveUrun(telefon);\n        saveUrun(tshirt);\n        System.out.println(\"Eklenen \u00dcr\u00fcnler: \" + laptop + \", \" + telefon + \", \" + tshirt);\n\n        \/\/ T\u00fcm \u00fcr\u00fcnleri listeleme\n        System.out.println(\"\\n--- T\u00fcm \u00dcr\u00fcnler ---\");\n        List<Urun> tumUrunler = getAllUrunler();\n        tumUrunler.forEach(System.out::println);\n\n        \/\/ Kategoriye g\u00f6re \u00fcr\u00fcnleri listeleme (Elektronik kategorisindeki \u00fcr\u00fcnler)\n        System.out.println(\"\\n--- Elektronik Kategorisindeki \u00dcr\u00fcnler ---\");\n        Kategori bulunanElektronik = getKategoriById(elektronik.getId());\n        if (bulunanElektronik != null && bulunanElektronik.getUrunler() != null) {\n            bulunanElektronik.getUrunler().forEach(System.out::println);\n        } else {\n            System.out.println(\"Elektronik kategorisi veya \u00fcr\u00fcnleri bulunamad\u0131.\");\n        }\n        \n        \/\/ Bir \u00fcr\u00fcn\u00fcn fiyat\u0131n\u0131 g\u00fcncelleme\n        System.out.println(\"\\nLaptop fiyat\u0131 g\u00fcncelleniyor...\");\n        laptop.setFiyat(14500.00);\n        updateUrun(laptop);\n        System.out.println(\"G\u00fcncellenen Laptop: \" + getUrunById(laptop.getId()));\n\n        HibernateUtil.shutdown();\n    }\n\n    private static void saveKategori(Kategori kategori) {\n        Transaction transaction = null;\n        try (Session session = HibernateUtil.getSessionFactory().openSession()) {\n            transaction = session.beginTransaction();\n            session.save(kategori);\n            transaction.commit();\n        } catch (Exception e) {\n            if (transaction != null) transaction.rollback();\n            e.printStackTrace();\n        }\n    }\n\n    private static void saveUrun(Urun urun) {\n        Transaction transaction = null;\n        try (Session session = HibernateUtil.getSessionFactory().openSession()) {\n            transaction = session.beginTransaction();\n            session.save(urun);\n            transaction.commit();\n        } catch (Exception e) {\n            if (transaction != null) transaction.rollback();\n            e.printStackTrace();\n        }\n    }\n\n    private static Kategori getKategoriById(int id) {\n        try (Session session = HibernateUtil.getSessionFactory().openSession()) {\n            return session.get(Kategori.class, id);\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n    \n    private static Urun getUrunById(int id) {\n        try (Session session = HibernateUtil.getSessionFactory().openSession()) {\n            return session.get(Urun.class, id);\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n\n    private static List<Urun> getAllUrunler() {\n        try (Session session = HibernateUtil.getSessionFactory().openSession()) {\n            Query<Urun> query = session.createQuery(\"FROM Urun\", Urun.class);\n            return query.list();\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n    \n    private static void updateUrun(Urun urun) {\n        Transaction transaction = null;\n        try (Session session = HibernateUtil.getSessionFactory().openSession()) {\n            transaction = session.beginTransaction();\n            session.update(urun);\n            transaction.commit();\n        } catch (Exception e) {\n            if (transaction != null) {\n                transaction.rollback();\n            }\n            e.printStackTrace();\n        }\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu senaryo, Hibernate'\u0131n XML tabanl\u0131 yap\u0131land\u0131rma ile karma\u015f\u0131k veritaban\u0131 ili\u015fkilerini ve CRUD operasyonlar\u0131n\u0131 nas\u0131l kolayca y\u00f6netebilece\u011fini g\u00f6stermektedir. \u0130li\u015fkisel veritaban\u0131 d\u00fcnyas\u0131ndaki bu nesne-ili\u015fkisel e\u015fleme g\u00fcc\u00fc, geli\u015ftiricilerin daha verimli ve s\u00fcrd\u00fcr\u00fclebilir uygulamalar olu\u015fturmas\u0131na olanak tan\u0131r.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu makalede, Java'da Hibernate ile XML tabanl\u0131 konfig\u00fcrasyonun temel prensiplerini, ad\u0131m ad\u0131m uygulama s\u00fcre\u00e7lerini ve geli\u015fmi\u015f kullan\u0131m ipu\u00e7lar\u0131n\u0131 derinlemesine inceledik. Hibernate'\u0131n, JDBC'nin getirdi\u011fi karma\u015f\u0131kl\u0131\u011f\u0131 ortadan kald\u0131rarak veritaban\u0131 i\u015flemlerini nas\u0131l basitle\u015ftirdi\u011fini ve Java nesnelerimizle ili\u015fkisel veritaban\u0131 tablolar\u0131m\u0131z aras\u0131nda sorunsuz bir k\u00f6pr\u00fc kurdu\u011funu g\u00f6rd\u00fck.<\/p>\n<p><code>hibernate.cfg.xml<\/code> ile veritaban\u0131 ba\u011flant\u0131 detaylar\u0131n\u0131 ve genel ayarlar\u0131 yap\u0131land\u0131r\u0131rken, <code>.hbm.xml<\/code> dosyalar\u0131 arac\u0131l\u0131\u011f\u0131yla POJO'lar\u0131m\u0131z\u0131 veritaban\u0131 tablolar\u0131na nas\u0131l e\u015fleyece\u011fimizi \u00f6\u011frendik. <code>SessionFactory<\/code> ve <code>Session<\/code> kavramlar\u0131n\u0131n Hibernate mimarisindeki kritik rollerini anlad\u0131k ve <code>Session<\/code> nesneleri \u00fczerinden temel CRUD operasyonlar\u0131n\u0131 ba\u015far\u0131yla ger\u00e7ekle\u015ftirdik. Ayr\u0131ca, ba\u011flant\u0131 havuzlar\u0131 ve ikinci seviye \u00f6nbellekleme gibi performans art\u0131r\u0131c\u0131 ileri d\u00fczey konfig\u00fcrasyonlar\u0131 ve hata ay\u0131klama i\u00e7in etkili loglama y\u00f6ntemlerini ele ald\u0131k. Son olarak, bir e-ticaret uygulamas\u0131ndaki \u00fcr\u00fcn ve kategori y\u00f6netimi senaryosu ile ger\u00e7ek d\u00fcnya ili\u015fkilerini XML kullanarak nas\u0131l e\u015fleyebilece\u011fimizi pratik bir \u00f6rnekle peki\u015ftirdik.<\/p>\n<p>Hibernate'\u0131n XML konfig\u00fcrasyonu, esnekli\u011fi ve a\u00e7\u0131k yap\u0131s\u0131yla hala bir\u00e7ok projede de\u011ferini korumaktad\u0131r. Ancak modern Hibernate uygulamalar\u0131nda genellikle Java anotasyonlar\u0131 tercih edilmektedir, bu da konfig\u00fcrasyonun kodla daha entegre olmas\u0131n\u0131 sa\u011flar. Bu makale, Hibernate yolculu\u011funuzun ilk ad\u0131m\u0131 olup, veritaban\u0131 etkile\u015fimi katman\u0131n\u0131z\u0131 g\u00fc\u00e7lendirmek i\u00e7in sa\u011flam bir temel sunmaktad\u0131r. Gelecek makalelerde, anotasyon tabanl\u0131 konfig\u00fcrasyon gibi di\u011fer yakla\u015f\u0131mlara da de\u011finerek bilginizi daha da geni\u015fletebilirsiniz.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<ul>\n<li>\n<h3>Hibernate nedir ve neden kullanmal\u0131y\u0131m?<\/h3>\n<p>Hibernate, Java i\u00e7in bir ORM (Object-Relational Mapping) arac\u0131d\u0131r. Java nesnelerini ili\u015fkisel veritaban\u0131 tablolar\u0131na e\u015fleyerek, geli\u015ftiricilerin do\u011frudan SQL sorgular\u0131 yazmak yerine Java koduyla veritaban\u0131 i\u015flemleri yapmas\u0131n\u0131 sa\u011flar. Bu, kod tekrar\u0131n\u0131 azalt\u0131r, geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r, veritaban\u0131 ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131 sa\u011flar ve bak\u0131m maliyetlerini d\u00fc\u015f\u00fcr\u00fcr.<\/p>\n<\/li>\n<li>\n<h3>XML tabanl\u0131 konfig\u00fcrasyon ile anotasyon tabanl\u0131 konfig\u00fcrasyon aras\u0131ndaki fark nedir?<\/h3>\n<p>XML tabanl\u0131 konfig\u00fcrasyonda (bu makalede incelendi\u011fi gibi), varl\u0131k e\u015flemeleri ve Hibernate ayarlar\u0131 ayr\u0131 XML dosyalar\u0131nda (<code>.hbm.xml<\/code> ve <code>hibernate.cfg.xml<\/code>) tan\u0131mlan\u0131r. Anotasyon tabanl\u0131 konfig\u00fcrasyonda ise bu e\u015flemeler ve ayarlar do\u011frudan Java varl\u0131k s\u0131n\u0131flar\u0131 \u00fczerine <code>@Entity<\/code>, <code>@Table<\/code>, <code>@Column<\/code> gibi anotasyonlar kullan\u0131larak yap\u0131l\u0131r. Anotasyonlar daha kompakt ve okunabilir kabul edilirken, XML konfig\u00fcrasyonu koddan ayr\u0131lma ve dinamik de\u011fi\u015ftirilebilirlik a\u00e7\u0131s\u0131ndan avantajlar sunabilir.<\/p>\n<\/li>\n<li>\n<h3><code>SessionFactory<\/code> ve <code>Session<\/code> aras\u0131ndaki temel fark nedir?<\/h3>\n<p><code>SessionFactory<\/code>, Hibernate'\u0131 yap\u0131land\u0131ran ve <code>Session<\/code> nesneleri olu\u015fturan, uygulama genelinde tekil (singleton) ve i\u015f par\u00e7ac\u0131\u011f\u0131 g\u00fcvenli (thread-safe) bir fabrikad\u0131r. Uygulama ba\u015flat\u0131ld\u0131\u011f\u0131nda bir kez olu\u015fturulur. <code>Session<\/code> ise veritaban\u0131 ile etkile\u015fimi sa\u011flayan, bir i\u015f birimiyle ili\u015fkili ve i\u015f par\u00e7ac\u0131\u011f\u0131 g\u00fcvenli olmayan bir aray\u00fczd\u00fcr. Her veritaban\u0131 i\u015flemi i\u00e7in yeni bir <code>Session<\/code> a\u00e7\u0131l\u0131p kapat\u0131lmas\u0131 \u00f6nerilir.<\/p>\n<\/li>\n<li>\n<h3>Hibernate'da veritaban\u0131 \u015femas\u0131n\u0131 otomatik olu\u015fturmak g\u00fcvenli midir?<\/h3>\n<p><code>hibernate.hbm2ddl.auto<\/code> \u00f6zelli\u011fini <code>create<\/code>, <code>create-drop<\/code> veya <code>update<\/code> olarak ayarlamak geli\u015ftirme ve test ortamlar\u0131nda \u00e7ok kullan\u0131\u015fl\u0131d\u0131r, \u00e7\u00fcnk\u00fc veritaban\u0131 \u015femas\u0131n\u0131 otomatik olarak y\u00f6netir. Ancak, \u00fcretim ortamlar\u0131nda bu \u00f6zelli\u011fi kullanmak ciddi veri kayb\u0131na veya istenmeyen \u015fema de\u011fi\u015fikliklerine yol a\u00e7abilece\u011fi i\u00e7in genellikle \u00f6nerilmez. \u00dcretim ortamlar\u0131nda <code>validate<\/code> kullanmak veya \u015fema de\u011fi\u015fikliklerini manuel olarak (\u00f6rne\u011fin, bir veritaban\u0131 ge\u00e7i\u015f arac\u0131yla) y\u00f6netmek daha g\u00fcvenlidir.<\/p>\n<\/li>\n<li>\n<h3>Hibernate HQL nedir?<\/h3>\n<p>HQL (Hibernate Query Language), Hibernate taraf\u0131ndan sa\u011flanan nesne y\u00f6nelimli bir sorgu dilidir. SQL'e benzer ancak veritaban\u0131 tablolar\u0131 ve s\u00fctunlar\u0131 yerine Java varl\u0131k s\u0131n\u0131flar\u0131 ve \u00f6zellikleri \u00fczerinde \u00e7al\u0131\u015f\u0131r. Bu sayede, geli\u015ftiriciler SQL'in karma\u015f\u0131kl\u0131\u011f\u0131ndan kurtularak Java nesneleri \u00fczerinde daha do\u011fal sorgular yazabilirler. Hibernate, HQL sorgular\u0131n\u0131 arka planda hedef veritaban\u0131n\u0131n diyalektine uygun SQL'e d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/p>\n<\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Java uygulamalar\u0131n\u0131zda veritaban\u0131 i\u015flemlerini daha az kodla ve daha etkili bir \u015fekilde y\u00f6netmek ister misiniz? Hibernate, bu s\u00fcreci&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1408],"tags":[],"class_list":{"0":"post-34989","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Hibernate ile Java&#039;da XML Konfig\u00fcrasyonu: Ad\u0131m Ad\u0131m Rehber<\/title>\n<meta name=\"description\" content=\"Java uygulamalar\u0131n\u0131zda veritaban\u0131 i\u015flemlerini daha az kodla ve daha etkili bir \u015fekilde y\u00f6netmek ister misiniz? Hibernate, bu s\u00fcreci basitle\u015ftiren g\u00fc\u00e7l\u00fc bir ORM arac\u0131d\u0131r. Bu makalede, Hibernate&#039;\u0131 XML tabanl\u0131 yap\u0131land\u0131rma ile ad\u0131m ad\u0131m nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ke\u015ffedecek, veritaban\u0131 entegrasyonunuzu g\u00fc\u00e7lendireceksiniz.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hibernate ile Java&#039;da XML Konfig\u00fcrasyonu: Ad\u0131m Ad\u0131m Rehber\" \/>\n<meta property=\"og:description\" content=\"Java uygulamalar\u0131n\u0131zda veritaban\u0131 i\u015flemlerini daha az kodla ve daha etkili bir \u015fekilde y\u00f6netmek ister misiniz? Hibernate, bu s\u00fcreci basitle\u015ftiren g\u00fc\u00e7l\u00fc bir ORM arac\u0131d\u0131r. Bu makalede, Hibernate&#039;\u0131 XML tabanl\u0131 yap\u0131land\u0131rma ile ad\u0131m ad\u0131m nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ke\u015ffedecek, veritaban\u0131 entegrasyonunuzu g\u00fc\u00e7lendireceksiniz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-24T10:01:20+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"28 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Hibernate ile Java&#8217;da XML Konfig\u00fcrasyonu: Ad\u0131m Ad\u0131m Rehber\",\"datePublished\":\"2025-11-24T10:01:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/\"},\"wordCount\":4117,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Java\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/\",\"name\":\"Hibernate ile Java'da XML Konfig\u00fcrasyonu: Ad\u0131m Ad\u0131m Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-24T10:01:20+00:00\",\"description\":\"Java uygulamalar\u0131n\u0131zda veritaban\u0131 i\u015flemlerini daha az kodla ve daha etkili bir \u015fekilde y\u00f6netmek ister misiniz? Hibernate, bu s\u00fcreci basitle\u015ftiren g\u00fc\u00e7l\u00fc bir ORM arac\u0131d\u0131r. Bu makalede, Hibernate'\u0131 XML tabanl\u0131 yap\u0131land\u0131rma ile ad\u0131m ad\u0131m nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ke\u015ffedecek, veritaban\u0131 entegrasyonunuzu g\u00fc\u00e7lendireceksiniz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Hibernate ile Java&#8217;da XML Konfig\u00fcrasyonu: Ad\u0131m Ad\u0131m Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Hibernate ile Java'da XML Konfig\u00fcrasyonu: Ad\u0131m Ad\u0131m Rehber","description":"Java uygulamalar\u0131n\u0131zda veritaban\u0131 i\u015flemlerini daha az kodla ve daha etkili bir \u015fekilde y\u00f6netmek ister misiniz? Hibernate, bu s\u00fcreci basitle\u015ftiren g\u00fc\u00e7l\u00fc bir ORM arac\u0131d\u0131r. Bu makalede, Hibernate'\u0131 XML tabanl\u0131 yap\u0131land\u0131rma ile ad\u0131m ad\u0131m nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ke\u015ffedecek, veritaban\u0131 entegrasyonunuzu g\u00fc\u00e7lendireceksiniz.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Hibernate ile Java'da XML Konfig\u00fcrasyonu: Ad\u0131m Ad\u0131m Rehber","og_description":"Java uygulamalar\u0131n\u0131zda veritaban\u0131 i\u015flemlerini daha az kodla ve daha etkili bir \u015fekilde y\u00f6netmek ister misiniz? Hibernate, bu s\u00fcreci basitle\u015ftiren g\u00fc\u00e7l\u00fc bir ORM arac\u0131d\u0131r. Bu makalede, Hibernate'\u0131 XML tabanl\u0131 yap\u0131land\u0131rma ile ad\u0131m ad\u0131m nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ke\u015ffedecek, veritaban\u0131 entegrasyonunuzu g\u00fc\u00e7lendireceksiniz.","og_url":"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-24T10:01:20+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"28 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Hibernate ile Java&#8217;da XML Konfig\u00fcrasyonu: Ad\u0131m Ad\u0131m Rehber","datePublished":"2025-11-24T10:01:20+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/"},"wordCount":4117,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Java"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/","name":"Hibernate ile Java'da XML Konfig\u00fcrasyonu: Ad\u0131m Ad\u0131m Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-24T10:01:20+00:00","description":"Java uygulamalar\u0131n\u0131zda veritaban\u0131 i\u015flemlerini daha az kodla ve daha etkili bir \u015fekilde y\u00f6netmek ister misiniz? Hibernate, bu s\u00fcreci basitle\u015ftiren g\u00fc\u00e7l\u00fc bir ORM arac\u0131d\u0131r. Bu makalede, Hibernate'\u0131 XML tabanl\u0131 yap\u0131land\u0131rma ile ad\u0131m ad\u0131m nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ke\u015ffedecek, veritaban\u0131 entegrasyonunuzu g\u00fc\u00e7lendireceksiniz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-ile-javada-xml-konfigurasyonu-adim-adim-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Hibernate ile Java&#8217;da XML Konfig\u00fcrasyonu: Ad\u0131m Ad\u0131m Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34989","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34989"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34989\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34989"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34989"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34989"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}