{"id":33174,"date":"2025-10-30T15:41:27","date_gmt":"2025-10-30T12:41:27","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33174"},"modified":"2025-10-30T15:41:27","modified_gmt":"2025-10-30T12:41:27","slug":"hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/","title":{"rendered":"Hibernate One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131"},"content":{"rendered":"<p><body><\/p>\n<h2>Hibernate One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131<\/h2>\n<h3>Giri\u015f: Hibernate ve \u0130li\u015fkisel Veritabanlar\u0131<\/h3>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirmede, nesne y\u00f6nelimli programlama (OOP) dilleri ile ili\u015fkisel veritabanlar\u0131 aras\u0131nda bir k\u00f6pr\u00fc kurmak kritik bir \u00f6neme sahiptir. Bu k\u00f6pr\u00fc, &#8220;Nesne-\u0130li\u015fkisel E\u015fleme&#8221; (Object-Relational Mapping &#8211; ORM) ara\u00e7lar\u0131 arac\u0131l\u0131\u011f\u0131yla sa\u011flan\u0131r. Hibernate, Java ekosistemindeki en pop\u00fcler ve g\u00fc\u00e7l\u00fc ORM ara\u00e7lar\u0131ndan biridir. Geli\u015ftiricilerin SQL sorgular\u0131 yazma zahmetinden kurtulmas\u0131n\u0131 sa\u011flayarak, veritaban\u0131 i\u015flemlerini Java nesneleri \u00fczerinden ger\u00e7ekle\u015ftirmelerine olanak tan\u0131r. Bu sayede, i\u015f mant\u0131\u011f\u0131na daha fazla odaklan\u0131labilir ve veritaban\u0131 ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131 art\u0131r\u0131l\u0131r.<\/p>\n<p>\u0130li\u015fkisel veritabanlar\u0131, tablolar aras\u0131ndaki ili\u015fkileri tan\u0131mlamak i\u00e7in \u00e7e\u015fitli mekanizmalar sunar. Bu ili\u015fkiler genellikle \u00fc\u00e7 ana kategoriye ayr\u0131l\u0131r: Bire-Bir (One-to-One), Bire-\u00c7ok (One-to-Many) ve \u00c7oka-\u00c7ok (Many-to-Many). Bu makalede, bu ili\u015fkilerden &#8220;Bire-Bir&#8221; (One-to-One) ili\u015fkisinin Hibernate&#8217;de, \u00f6zellikle de annotation&#8217;lar kullan\u0131larak nas\u0131l modellendi\u011fini ve y\u00f6netildi\u011fini ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceleyece\u011fiz. Bire-Bir ili\u015fkiler, genellikle bir varl\u0131\u011f\u0131n di\u011fer bir varl\u0131kla kesinlikle tekil bir ba\u011flant\u0131ya sahip oldu\u011fu durumlarda kullan\u0131l\u0131r. \u00d6rne\u011fin, bir &#8220;Kullan\u0131c\u0131&#8221;n\u0131n sadece bir &#8220;Kullan\u0131c\u0131Profili&#8221;ne veya bir &#8220;\u00c7al\u0131\u015fan&#8221;\u0131n sadece bir &#8220;Pasaport&#8221; bilgisine sahip olmas\u0131 gibi senaryolarda kar\u015f\u0131m\u0131za \u00e7\u0131kar. Hibernate, bu t\u00fcr karma\u015f\u0131k veritaban\u0131 ili\u015fkilerini Java s\u0131n\u0131flar\u0131 aras\u0131nda basit ve anla\u015f\u0131l\u0131r annotation&#8217;lar arac\u0131l\u0131\u011f\u0131yla temsil etme yetene\u011fi sunar.<\/p>\n<h3>Hibernate&#8217;de Annotation Tabanl\u0131 Yap\u0131land\u0131rma<\/h3>\n<p>Hibernate, ba\u015flang\u0131\u00e7ta XML tabanl\u0131 yap\u0131land\u0131rma dosyalar\u0131 (\u00f6rne\u011fin <code>.hbm.xml<\/code>) ile pop\u00fclerlik kazanm\u0131\u015f olsa da, g\u00fcn\u00fcm\u00fczde annotation&#8217;lar (Java 5&#8217;ten itibaren gelen <code>@<\/code> ile ba\u015flayan yap\u0131lar) arac\u0131l\u0131\u011f\u0131yla yap\u0131lan yap\u0131land\u0131rma \u00e7ok daha yayg\u0131n ve tercih edilen bir y\u00f6ntem haline gelmi\u015ftir. Annotation&#8217;lar, ilgili kodu ve meta veriyi ayn\u0131 yerde tutarak okunabilirli\u011fi art\u0131r\u0131r, geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r ve XML dosyalar\u0131n\u0131n y\u00f6netim y\u00fck\u00fcn\u00fc ortadan kald\u0131r\u0131r. Bu yakla\u015f\u0131m, \u00f6zellikle Spring Data JPA gibi modern framework&#8217;lerle entegre edildi\u011finde, geli\u015ftiricilere daha tutarl\u0131 ve verimli bir deneyim sunar.<\/p>\n<p>Bir Hibernate projesinde annotation&#8217;lar\u0131 kullanmak i\u00e7in gerekli temel ba\u011f\u0131ml\u0131l\u0131klar genellikle <code>hibernate-core<\/code> ve veritaban\u0131 s\u00fcr\u00fcc\u00fcs\u00fcd\u00fcr. Bu ba\u011f\u0131ml\u0131l\u0131klar, Maven veya Gradle gibi ba\u011f\u0131ml\u0131l\u0131k y\u00f6netim ara\u00e7lar\u0131 arac\u0131l\u0131\u011f\u0131yla kolayca projenize eklenebilir. Annotation&#8217;lar sayesinde, Java s\u0131n\u0131flar\u0131n\u0131z\u0131 do\u011frudan veritaban\u0131 tablolar\u0131na, s\u00fctunlar\u0131na ve aralar\u0131ndaki ili\u015fkilere e\u015fle\u015ftirebiliriz.<\/p>\n<h3>Bire-Bir (One-to-One) \u0130li\u015fki T\u00fcrleri ve Uygulama Senaryolar\u0131<\/h3>\n<p>Bire-Bir ili\u015fkiler, veritaban\u0131 tasar\u0131m\u0131nda iki ana \u015fekilde modellenebilir ve Hibernate&#8217;de bu iki modelleme yakla\u015f\u0131m\u0131 farkl\u0131 annotation&#8217;lar ve stratejiler gerektirir:<\/p>\n<h4>1. Payla\u015f\u0131lan Birincil Anahtar (Shared Primary Key)<\/h4>\n<p>Bu senaryoda, her iki tablonun da ayn\u0131 birincil anahtar\u0131 (Primary Key) payla\u015fmas\u0131 esast\u0131r. Genellikle bir tablo, di\u011fer bir tablonun &#8220;uzant\u0131s\u0131&#8221; veya &#8220;detay\u0131&#8221; oldu\u011funda bu yakla\u015f\u0131m tercih edilir. \u00d6rne\u011fin, bir <code>Kullanici<\/code> tablosu ve bu kullan\u0131c\u0131n\u0131n ek bilgilerini tutan <code>KullaniciDetay<\/code> tablosu. <code>KullaniciDetay<\/code> tablosunun birincil anahtar\u0131, ayn\u0131 zamanda <code>Kullanici<\/code> tablosunun birincil anahtar\u0131d\u0131r ve bu iki tablo aras\u0131nda hem birincil anahtar hem de yabanc\u0131 anahtar (Foreign Key) olarak i\u015flev g\u00f6r\u00fcr.<\/p>\n<p>*   <strong>\u00d6rnek Senaryo:<\/strong> Bir <code>Kullanici<\/code> nesnesi, temel kimlik bilgilerini (ID, kullan\u0131c\u0131 ad\u0131, \u015fifre) i\u00e7erirken, <code>KullaniciDetay<\/code> nesnesi daha az eri\u015filen veya daha \u00f6zel bilgileri (adres, telefon, do\u011fum tarihi) tutabilir. Bu, veritaban\u0131 performans\u0131n\u0131 art\u0131rmak ve veri modelini daha mod\u00fcler hale getirmek i\u00e7in yap\u0131labilir.<\/p>\n<h4>2. Yabanc\u0131 Anahtar (Foreign Key) Tabanl\u0131 \u0130li\u015fki<\/h4>\n<p>Bu daha geleneksel ve yayg\u0131n bir One-to-One ili\u015fki modellemesidir. Bir tablonun birincil anahtar\u0131, di\u011fer tablonun bir s\u00fctununda yabanc\u0131 anahtar olarak tutulur. Bu durumda, yabanc\u0131 anahtar\u0131 i\u00e7eren tablo &#8220;owning side&#8221; (sahip taraf) olarak kabul edilir ve ili\u015fkinin y\u00f6netiminden sorumludur.<\/p>\n<p>*   <strong>\u00d6rnek Senaryo:<\/strong> Bir <code>Calisan<\/code> nesnesinin bir <code>Pasaport<\/code> nesnesine sahip olmas\u0131. <code>Pasaport<\/code> tablosu, <code>Calisan<\/code> tablosunun birincil anahtar\u0131n\u0131 kendi i\u00e7inde bir yabanc\u0131 anahtar olarak tutar. Bu sayede her <code>Calisan<\/code> i\u00e7in tek bir <code>Pasaport<\/code> kayd\u0131 olabilir ve her <code>Pasaport<\/code> kayd\u0131 tek bir <code>Calisan<\/code>&#8216;a ait olur. Bu modelde, <code>Pasaport<\/code> tablosunun kendi birincil anahtar\u0131 genellikle otomatik artan bir de\u011fer olabilir ve <code>Calisan<\/code> ID&#8217;si ile ayn\u0131 olmak zorunda de\u011fildir.<\/p>\n<p>Bu iki farkl\u0131 modelleme yakla\u015f\u0131m\u0131, Hibernate&#8217;de farkl\u0131 annotation&#8217;lar ve stratejilerle ele al\u0131n\u0131r. \u015eimdi bu annotation&#8217;lar\u0131 ve kullan\u0131mlar\u0131n\u0131 detayl\u0131ca inceleyelim.<\/p>\n<h3>Hibernate One-to-One Mapping i\u00e7in Temel ve \u0130li\u015fki Annotasyonlar\u0131<\/h3>\n<p>Hibernate&#8217;de bir One-to-One ili\u015fkiyi tan\u0131mlamak i\u00e7in \u00e7e\u015fitli annotation&#8217;lar kullan\u0131l\u0131r. Bunlar\u0131 genel ve ili\u015fkiye \u00f6zg\u00fc olarak ikiye ay\u0131rabiliriz:<\/p>\n<h4>Temel Varl\u0131k Annotasyonlar\u0131:<\/h4>\n<p>*   <code>@Entity<\/code>: Bir Java s\u0131n\u0131f\u0131n\u0131n bir veritaban\u0131 tablosuna e\u015flenen bir varl\u0131k oldu\u011funu belirtir. Hibernate, bu s\u0131n\u0131flar\u0131 y\u00f6netir.<br \/>\n*   <code>@Table(name = \"tablo_adi\")<\/code>: \u0130ste\u011fe ba\u011fl\u0131d\u0131r. E\u011fer s\u0131n\u0131f ad\u0131 ile veritaban\u0131 tablo ad\u0131 farkl\u0131ysa kullan\u0131l\u0131r.<br \/>\n*   <code>@Id<\/code>: Birincil anahtar alan\u0131n\u0131 belirtir. Her varl\u0131k s\u0131n\u0131f\u0131nda mutlaka bulunmal\u0131d\u0131r.<br \/>\n*   <code>@GeneratedValue(strategy = GenerationType.IDENTITY)<\/code>: Birincil anahtar\u0131n nas\u0131l \u00fcretilece\u011fini belirtir. <code>IDENTITY<\/code>, <code>AUTO<\/code>, <code>SEQUENCE<\/code>, <code>TABLE<\/code> gibi stratejiler mevcuttur. <code>IDENTITY<\/code> genellikle otomatik artan s\u00fctunlar i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>@Column(name = \"sutun_adi\", nullable = false, unique = true, length = 255)<\/code>: \u0130ste\u011fe ba\u011fl\u0131d\u0131r. Alan ad\u0131 ile veritaban\u0131 s\u00fctun ad\u0131 farkl\u0131ysa veya s\u00fctun \u00f6zellikleri (null olamaz, benzersiz, uzunluk vb.) belirtilmek isteniyorsa kullan\u0131l\u0131r.<\/p>\n<h4>One-to-One \u0130li\u015fki i\u00e7in \u00d6zel Annotasyonlar:<\/h4>\n<p>*   <code>@OneToOne<\/code>: Bu annotation, iki varl\u0131k s\u0131n\u0131f\u0131 aras\u0131nda bire-bir bir ili\u015fki oldu\u011funu belirtir. Alan\u0131n \u00fczerine eklenir.<br \/>\n    *   <code>mappedBy = \"ili\u015fki_alan\u0131\"<\/code>: Bu \u00f6zellik, ili\u015fkinin &#8220;non-owning side&#8221; (sahip olmayan taraf) taraf\u0131ndan kullan\u0131l\u0131r. \u0130li\u015fkinin di\u011fer taraf\u0131ndaki (owning side) alan\u0131n ad\u0131n\u0131 belirtir. <code>mappedBy<\/code> kullanan taraf, veritaban\u0131nda yabanc\u0131 anahtar\u0131 tutmaz; bu anahtar di\u011fer tarafta bulunur. <code>mappedBy<\/code> olmadan, Hibernate her iki tarafta da bir yabanc\u0131 anahtar s\u00fctunu olu\u015fturmaya \u00e7al\u0131\u015f\u0131r ki bu bire-bir ili\u015fkilerde genellikle istenmez.<br \/>\n    *   <code>cascade = CascadeType.ALL<\/code>: \u0130li\u015fkili varl\u0131klar \u00fczerindeki i\u015flemlerin (kaydetme, g\u00fcncelleme, silme vb.) nas\u0131l yay\u0131ld\u0131\u011f\u0131n\u0131 y\u00f6netir. \u00d6rne\u011fin, bir <code>Kullanici<\/code> silindi\u011finde, ili\u015fkili <code>KullaniciDetay<\/code>&#8216;\u0131n da silinmesini istiyorsak <code>CascadeType.REMOVE<\/code> veya <code>CascadeType.ALL<\/code> kullan\u0131r\u0131z. Di\u011fer yayg\u0131n de\u011ferler <code>PERSIST<\/code>, <code>MERGE<\/code>, <code>REFRESH<\/code>, <code>DETACH<\/code>&#8216;dir.<br \/>\n    *   <code>fetch = FetchType.LAZY<\/code>: \u0130li\u015fkili verilerin ne zaman y\u00fcklenece\u011fini belirler. <code>FetchType.LAZY<\/code> (varsay\u0131lan), ili\u015fkili varl\u0131\u011f\u0131n ancak ihtiya\u00e7 duyuldu\u011funda (eri\u015fildi\u011finde) y\u00fcklenmesini sa\u011flar. <code>FetchType.EAGER<\/code> ise ana varl\u0131k y\u00fcklendi\u011finde ili\u015fkili varl\u0131\u011f\u0131n da hemen y\u00fcklenmesini sa\u011flar. Performans i\u00e7in genellikle <code>LAZY<\/code> tercih edilir.<br \/>\n    *   <code>orphanRemoval = true<\/code>: Yaln\u0131z kalan \u00e7ocuk varl\u0131klar\u0131n silinmesini sa\u011flar. E\u011fer bir \u00e7ocuk varl\u0131k, ebeveyninden ayr\u0131l\u0131rsa (ili\u015fki kopar\u0131l\u0131rsa), veritaban\u0131ndan otomatik olarak silinir. Bu \u00f6zellik, <code>cascade = CascadeType.REMOVE<\/code> veya <code>CascadeType.ALL<\/code> ile birlikte kullan\u0131lmal\u0131d\u0131r.<br \/>\n*   <code>@JoinColumn(name = \"yabanci_anahtar_sutunu_adi\", unique = true, nullable = false)<\/code>: Bu annotation, ili\u015fkinin &#8220;owning side&#8221; (sahip taraf) taraf\u0131ndan kullan\u0131l\u0131r ve yabanc\u0131 anahtar\u0131n bulundu\u011fu s\u00fctunu belirtir. <code>unique = true<\/code> \u00f6zelli\u011fi, bire-bir ili\u015fkiyi garanti etmek i\u00e7in \u00f6nemlidir, \u00e7\u00fcnk\u00fc bu, bu s\u00fctunda her de\u011ferin yaln\u0131zca bir kez g\u00f6r\u00fcnebilece\u011fi anlam\u0131na gelir.<br \/>\n*   <code>@PrimaryKeyJoinColumn<\/code>: Bu annotation, \u00f6zellikle &#8220;payla\u015f\u0131lan birincil anahtar&#8221; senaryosunda kullan\u0131l\u0131r. \u0130li\u015fkili varl\u0131\u011f\u0131n birincil anahtar\u0131n\u0131n, ayn\u0131 zamanda yabanc\u0131 anahtar olarak kullan\u0131ld\u0131\u011f\u0131n\u0131 belirtir. Yani, iki tablo ayn\u0131 PK&#8217;y\u0131 payla\u015f\u0131r.<br \/>\n*   <code>@MapsId<\/code>: Payla\u015f\u0131lan birincil anahtar senaryosunda, alt (child) varl\u0131\u011f\u0131n birincil anahtar\u0131n\u0131n \u00fcst (parent) varl\u0131\u011f\u0131n birincil anahtar\u0131ndan t\u00fcretildi\u011fini belirtir. Genellikle <code>@PrimaryKeyJoinColumn<\/code> ile birlikte kullan\u0131l\u0131r.<\/p>\n<h3>\u00d6rnek Uygulama: Bire-Bir \u0130li\u015fkilerin Modellenmesi<\/h3>\n<p>\u015eimdi iki farkl\u0131 bire-bir ili\u015fki modellemesini kod \u00f6rnekleriyle inceleyelim.<\/p>\n<h4>Y\u00f6ntem 1: Payla\u015f\u0131lan Birincil Anahtar (Shared Primary Key)<\/h4>\n<p>Bu senaryoda, bir <code>Kullanici<\/code> ve <code>KullaniciDetay<\/code> varl\u0131klar\u0131m\u0131z olacak. <code>KullaniciDetay<\/code>&#8216;\u0131n ID&#8217;si, <code>Kullanici<\/code>&#8216;n\u0131n ID&#8217;si ile ayn\u0131 olacak.<\/p>\n<p><strong>Kullanici.java (Owning Side &#8211; Ebeveyn)<\/strong><\/p>\n<pre><code class=\"language-java\">package com.example.hibernate.onetone.sharedpk.entity;\n\nimport javax.persistence.*;\n\n@Entity\n@Table(name = \"kullanicilar\")\npublic class Kullanici {\n\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    @Column(name = \"kullanici_id\")\n    private Long id;\n\n    @Column(name = \"kullanici_adi\", unique = true, nullable = false)\n    private String kullaniciAdi;\n\n    @Column(name = \"eposta\", unique = true, nullable = false)\n    private String eposta;\n\n    \/\/ One-to-One ili\u015fki: Kullanici bir KullaniciDetay'a sahiptir.\n    \/\/ cascade = CascadeType.ALL: Kullanici ile yap\u0131lan t\u00fcm i\u015flemler KullaniciDetay'a da yans\u0131r.\n    \/\/ orphanRemoval = true: E\u011fer bir KullaniciDetay, Kullanici'dan ayr\u0131l\u0131rsa silinir.\n    \/\/ mappedBy = \"kullanici\": KullaniciDetay s\u0131n\u0131f\u0131ndaki \"kullanici\" alan\u0131 bu ili\u015fkinin sahibidir.\n    \/\/ Bu taraf (Kullanici) owning side de\u011fildir, \u00e7\u00fcnk\u00fc mappedBy kullan\u0131lm\u0131\u015ft\u0131r.\n    \/\/ Ancak Shared Primary Key'de mant\u0131ksal olarak Kullanici ebeveyn gibi davran\u0131r.\n    @OneToOne(mappedBy = \"kullanici\", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)\n    private KullaniciDetay detay;\n\n    public Kullanici() {\n    }\n\n    public Kullanici(String kullaniciAdi, String eposta) {\n        this.kullaniciAdi = kullaniciAdi;\n        this.eposta = eposta;\n    }\n\n    \/\/ Getter ve Setter'lar\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getKullaniciAdi() {\n        return kullaniciAdi;\n    }\n\n    public void setKullaniciAdi(String kullaniciAdi) {\n        this.kullaniciAdi = kullaniciAdi;\n    }\n\n    public String getEposta() {\n        return eposta;\n    }\n\n    public void setEposta(String eposta) {\n        this.eposta = eposta;\n    }\n\n    public KullaniciDetay getDetay() {\n        return detay;\n    }\n\n    \/\/ \u0130li\u015fkiyi iki tarafl\u0131 kurmak i\u00e7in helper metot\n    public void setDetay(KullaniciDetay detay) {\n        if (detay == null) {\n            if (this.detay != null) {\n                this.detay.setKullanici(null);\n            }\n        } else {\n            detay.setKullanici(this);\n        }\n        this.detay = detay;\n    }\n\n    @Override\n    public String toString() {\n        return \"Kullanici{\" +\n               \"id=\" + id +\n               \", kullaniciAdi='\" + kullaniciAdi + '\\'' +\n               \", eposta='\" + eposta + '\\'' +\n               '}';\n    }\n}<\/code><\/pre>\n<p><strong>KullaniciDetay.java (Non-Owning Side &#8211; \u00c7ocuk)<\/strong><\/p>\n<pre><code class=\"language-java\">package com.example.hibernate.onetone.sharedpk.entity;\n\nimport javax.persistence.*;\n\n@Entity\n@Table(name = \"kullanici_detaylari\")\npublic class KullaniciDetay {\n\n    \/\/ KullaniciDetay'\u0131n ID'si, Kullanici'n\u0131n ID'si ile ayn\u0131d\u0131r.\n    \/\/ @MapsId, bu ID'nin ili\u015fkili varl\u0131ktan (Kullanici) e\u015flendi\u011fini belirtir.\n    @Id\n    @Column(name = \"kullanici_id\") \/\/ S\u00fctun ad\u0131, Kullanici tablosundaki PK ile ayn\u0131.\n    private Long id;\n\n    @Column(name = \"adres\")\n    private String adres;\n\n    @Column(name = \"telefon\")\n    private String telefon;\n\n    \/\/ One-to-One ili\u015fki: KullaniciDetay bir Kullanici'ya aittir.\n    \/\/ @MapsId ile birlikte, @PrimaryKeyJoinColumn kullan\u0131l\u0131r.\n    \/\/ name = \"kullanici_id\": Bu tablodaki yabanc\u0131 anahtar s\u00fctunu.\n    \/\/ referencedColumnName = \"kullanici_id\": \u0130li\u015fkili tablodaki (Kullanici) referans al\u0131nan s\u00fctun.\n    @OneToOne(fetch = FetchType.LAZY)\n    @MapsId \/\/ Bu, birincil anahtar\u0131n ili\u015fkili varl\u0131ktan al\u0131nd\u0131\u011f\u0131n\u0131 belirtir.\n    @JoinColumn(name = \"kullanici_id\") \/\/ Bu tarafta yabanc\u0131 anahtar yok, sadece ID e\u015flemesi.\n                                        \/\/ Asl\u0131nda bu, bu tablonun PK's\u0131n\u0131n ayn\u0131 zamanda FK oldu\u011funu belirtir.\n    private Kullanici kullanici;\n\n    public KullaniciDetay() {\n    }\n\n    public KullaniciDetay(String adres, String telefon) {\n        this.adres = adres;\n        this.telefon = telefon;\n    }\n\n    \/\/ Getter ve Setter'lar\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getAdres() {\n        return adres;\n    }\n\n    public void setAdres(String adres) {\n        this.adres = adres;\n    }\n\n    public String getTelefon() {\n        return telefon;\n    }\n\n    public void setTelefon(String telefon) {\n        this.telefon = telefon;\n    }\n\n    public Kullanici getKullanici() {\n        return kullanici;\n    }\n\n    public void setKullanici(Kullanici kullanici) {\n        this.kullanici = kullanici;\n    }\n\n    @Override\n    public String toString() {\n        return \"KullaniciDetay{\" +\n               \"id=\" + id +\n               \", adres='\" + adres + '\\'' +\n               \", telefon='\" + telefon + '\\'' +\n               '}';\n    }\n}<\/code><\/pre>\n<p><strong>A\u00e7\u0131klama:<\/strong><br \/>\n*   <code>Kullanici<\/code> s\u0131n\u0131f\u0131, <code>KullaniciDetay<\/code> s\u0131n\u0131f\u0131ndaki <code>kullanici<\/code> alan\u0131n\u0131 <code>mappedBy<\/code> ile referans g\u00f6sterir. Bu, <code>Kullanici<\/code>&#8216;n\u0131n &#8220;non-owning side&#8221; oldu\u011funu ve yabanc\u0131 anahtar\u0131n <code>KullaniciDetay<\/code> tablosunda tutuldu\u011funu belirtir. Ancak, payla\u015f\u0131lan birincil anahtar durumunda, <code>KullaniciDetay<\/code>&#8216;\u0131n kendi birincil anahtar\u0131 <code>Kullanici<\/code>&#8216;n\u0131n birincil anahtar\u0131n\u0131 referans ald\u0131\u011f\u0131 i\u00e7in, mant\u0131ksal olarak <code>KullaniciDetay<\/code> &#8220;owning side&#8221; gibi davran\u0131r.<br \/>\n*   <code>KullaniciDetay<\/code> s\u0131n\u0131f\u0131nda, <code>@Id<\/code> ve <code>@MapsId<\/code> annotation&#8217;lar\u0131 birlikte kullan\u0131l\u0131r. <code>@MapsId<\/code> bu varl\u0131\u011f\u0131n birincil anahtar\u0131n\u0131n, ili\u015fkili varl\u0131\u011f\u0131n (bu durumda <code>Kullanici<\/code>) birincil anahtar\u0131ndan al\u0131nd\u0131\u011f\u0131n\u0131 belirtir.<br \/>\n*   <code>@JoinColumn(name = \"kullanici_id\")<\/code> burada <code>KullaniciDetay<\/code>&#8216;\u0131n birincil anahtar\u0131n\u0131n ayn\u0131 zamanda <code>Kullanici<\/code> tablosuna bir referans (yabanc\u0131 anahtar) oldu\u011funu g\u00f6sterir. Bu, veritaban\u0131nda <code>kullanici_detaylari<\/code> tablosunun <code>kullanici_id<\/code> s\u00fctununun hem PK hem de FK olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Y\u00f6ntem 2: Yabanc\u0131 Anahtar (Foreign Key) Tabanl\u0131 \u0130li\u015fki<\/h4>\n<p>Bu senaryoda, bir <code>Calisan<\/code> ve <code>Pasaport<\/code> varl\u0131klar\u0131m\u0131z olacak. <code>Pasaport<\/code> tablosu, <code>Calisan<\/code> tablosunun ID&#8217;sini yabanc\u0131 anahtar olarak tutacak. <code>Pasaport<\/code>&#8216;un kendi ayr\u0131 birincil anahtar\u0131 olacak.<\/p>\n<p><strong>Calisan.java (Owning Side &#8211; Sahip Taraf)<\/strong><\/p>\n<pre><code class=\"language-java\">package com.example.hibernate.onetone.fk.entity;\n\nimport javax.persistence.*;\n\n@Entity\n@Table(name = \"calisanlar\")\npublic class Calisan {\n\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    @Column(name = \"calisan_id\")\n    private Long id;\n\n    @Column(name = \"ad\", nullable = false)\n    private String ad;\n\n    @Column(name = \"soyad\", nullable = false)\n    private String soyad;\n\n    \/\/ One-to-One ili\u015fki: Calisan bir Pasaport'a sahiptir.\n    \/\/ cascade = CascadeType.ALL: Calisan ile yap\u0131lan t\u00fcm i\u015flemler Pasaport'a da yans\u0131r.\n    \/\/ orphanRemoval = true: E\u011fer bir Pasaport, Calisan'dan ayr\u0131l\u0131rsa silinir.\n    \/\/ @JoinColumn(name = \"pasaport_id\", unique = true, nullable = false):\n    \/\/ Bu, \"calisanlar\" tablosunda \"pasaport_id\" ad\u0131nda bir yabanc\u0131 anahtar s\u00fctunu olu\u015fturur.\n    \/\/ unique = true: Bir pasaport sadece bir \u00e7al\u0131\u015fana ait olabilir, bu bire-bir ili\u015fkiyi garanti eder.\n    \/\/ nullable = false: Her \u00e7al\u0131\u015fan\u0131n bir pasaportu olmak zorunda.\n    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)\n    @JoinColumn(name = \"pasaport_id\", unique = true, nullable = false)\n    private Pasaport pasaport;\n\n    public Calisan() {\n    }\n\n    public Calisan(String ad, String soyad) {\n        this.ad = ad;\n        this.soyad = soyad;\n    }\n\n    \/\/ Getter ve Setter'lar\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getAd() {\n        return ad;\n    }\n\n    public void setAd(String ad) {\n        this.ad = ad;\n    }\n\n    public String getSoyad() {\n        return soyad;\n    }\n\n    public void setSoyad(String soyad) {\n        this.soyad = soyad;\n    }\n\n    public Pasaport getPasaport() {\n        return pasaport;\n    }\n\n    \/\/ \u0130li\u015fkiyi iki tarafl\u0131 kurmak i\u00e7in helper metot\n    public void setPasaport(Pasaport pasaport) {\n        if (pasaport == null) {\n            if (this.pasaport != null) {\n                this.pasaport.setCalisan(null);\n            }\n        } else {\n            pasaport.setCalisan(this);\n        }\n        this.pasaport = pasaport;\n    }\n\n    @Override\n    public String toString() {\n        return \"Calisan{\" +\n               \"id=\" + id +\n               \", ad='\" + ad + '\\'' +\n               \", soyad='\" + soyad + '\\'' +\n               '}';\n    }\n}<\/code><\/pre>\n<p><strong>Pasaport.java (Non-Owning Side &#8211; Sahip Olmayan Taraf)<\/strong><\/p>\n<pre><code class=\"language-java\">package com.example.hibernate.onetone.fk.entity;\n\nimport javax.persistence.*;\nimport java.time.LocalDate;\n\n@Entity\n@Table(name = \"pasaportlar\")\npublic class Pasaport {\n\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    @Column(name = \"pasaport_id\")\n    private Long id;\n\n    @Column(name = \"pasaport_numarasi\", unique = true, nullable = false)\n    private String pasaportNumarasi;\n\n    @Column(name = \"verilis_tarihi\", nullable = false)\n    private LocalDate verilisTarihi;\n\n    @Column(name = \"son_gecerlilik_tarihi\", nullable = false)\n    private LocalDate sonGecerlilikTarihi;\n\n    \/\/ One-to-One ili\u015fki: Pasaport bir Calisan'a aittir.\n    \/\/ mappedBy = \"pasaport\": Calisan s\u0131n\u0131f\u0131ndaki \"pasaport\" alan\u0131 bu ili\u015fkinin sahibidir.\n    \/\/ Bu taraf (Pasaport) owning side de\u011fildir, yabanc\u0131 anahtar\u0131 tutmaz.\n    @OneToOne(mappedBy = \"pasaport\", fetch = FetchType.LAZY)\n    private Calisan calisan;\n\n    public Pasaport() {\n    }\n\n    public Pasaport(String pasaportNumarasi, LocalDate verilisTarihi, LocalDate sonGecerlilikTarihi) {\n        this.pasaportNumarasi = pasaportNumarasi;\n        this.verilisTarihi = verilisTarihi;\n        this.sonGecerlilikTarihi = sonGecerlilikTarihi;\n    }\n\n    \/\/ Getter ve Setter'lar\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getPasaportNumarasi() {\n        return pasaportNumarasi;\n    }\n\n    public void setPasaportNumarasi(String pasaportNumarasi) {\n        this.pasaportNumarasi = pasaportNumarasi;\n    }\n\n    public LocalDate getVerilisTarihi() {\n        return verilisTarihi;\n    }\n\n    public void setVerilisTarihi(LocalDate verilisTarihi) {\n        this.verilisTarihi = verilisTarihi;\n    }\n\n    public LocalDate getSonGecerlilikTarihi() {\n        return sonGecerlilikTarihi;\n    }\n\n    public void setSonGecerlilikTarihi(LocalDate sonGecerlilikTarihi) {\n        this.sonGecerlilikTarihi = sonGecerlilikTarihi;\n    }\n\n    public Calisan getCalisan() {\n        return calisan;\n    }\n\n    public void setCalisan(Calisan calisan) {\n        this.calisan = calisan;\n    }\n\n    @Override\n    public String toString() {\n        return \"Pasaport{\" +\n               \"id=\" + id +\n               \", pasaportNumarasi='\" + pasaportNumarasi + '\\'' +\n               \", verilisTarihi=\" + verilisTarihi +\n               \", sonGecerlilikTarihi=\" + sonGecerlilikTarihi +\n               '}';\n    }\n}<\/code><\/pre>\n<p><strong>A\u00e7\u0131klama:<\/strong><br \/>\n*   <code>Calisan<\/code> s\u0131n\u0131f\u0131 &#8220;owning side&#8221;d\u0131r \u00e7\u00fcnk\u00fc <code>@JoinColumn<\/code> annotation&#8217;\u0131n\u0131 kullan\u0131r. Bu, <code>calisanlar<\/code> tablosunda <code>pasaport_id<\/code> ad\u0131nda bir yabanc\u0131 anahtar s\u00fctunu olu\u015fturulaca\u011f\u0131n\u0131 ve bu s\u00fctunun <code>pasaportlar<\/code> tablosundaki <code>pasaport_id<\/code>&#8216;yi referans alaca\u011f\u0131n\u0131 belirtir. <code>unique = true<\/code> \u00f6zelli\u011fi, bu yabanc\u0131 anahtar\u0131n her zaman benzersiz olmas\u0131n\u0131 sa\u011flayarak bire-bir ili\u015fkiyi zorunlu k\u0131lar.<br \/>\n*   <code>Pasaport<\/code> s\u0131n\u0131f\u0131 &#8220;non-owning side&#8221;d\u0131r ve <code>mappedBy = \"pasaport\"<\/code> kullan\u0131r. Bu, <code>Pasaport<\/code> nesnesinin kendisinin veritaban\u0131nda bir yabanc\u0131 anahtar s\u00fctunu olu\u015fturmayaca\u011f\u0131n\u0131, ili\u015fkinin <code>Calisan<\/code> s\u0131n\u0131f\u0131ndaki <code>pasaport<\/code> alan\u0131 taraf\u0131ndan y\u00f6netildi\u011fini g\u00f6sterir.<\/p>\n<p>Her iki \u00f6rnekte de, <code>setDetay<\/code> ve <code>setPasaport<\/code> gibi yard\u0131mc\u0131 metotlar (helper methods) tan\u0131mlanm\u0131\u015ft\u0131r. Bu metotlar, \u00e7ift y\u00f6nl\u00fc (bidirectional) ili\u015fkilerde her iki taraf\u0131n da do\u011fru \u015fekilde ayarlanmas\u0131n\u0131 sa\u011flar. Bu, \u00f6zellikle bir varl\u0131\u011f\u0131 kaydederken veya g\u00fcncellerken ili\u015fki tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in \u00f6nemlidir.<\/p>\n<h3>Hibernate Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>Hibernate&#8217;in \u00e7al\u0131\u015fabilmesi i\u00e7in veritaban\u0131 ba\u011flant\u0131 bilgilerini ve e\u015flenen varl\u0131k s\u0131n\u0131flar\u0131n\u0131 i\u00e7eren bir yap\u0131land\u0131rma dosyas\u0131na ihtiyac\u0131 vard\u0131r. Geleneksel olarak bu <code>hibernate.cfg.xml<\/code> dosyas\u0131d\u0131r.<\/p>\n<p><strong>hibernate.cfg.xml<\/strong><\/p>\n<pre><code class=\"language-xml\"><!DOCTYPE hibernate-configuration PUBLIC\n        \"-\/\/Hibernate\/Hibernate Configuration DTD 3.0\/\/EN\"\n        \"http:\/\/www.hibernate.org\/dtd\/hibernate-configuration-3.0.dtd\">\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_onetone_db?useSSL=false&amp;serverTimezone=UTC<\/property>\n        <property name=\"hibernate.connection.username\">root<\/property>\n        <property name=\"hibernate.connection.password\">your_password<\/property>\n\n        <!-- SQL Dialect (Kulland\u0131\u011f\u0131n\u0131z veritaban\u0131na g\u00f6re de\u011fi\u015fir) -->\n        <property name=\"hibernate.dialect\">org.hibernate.dialect.MySQL8Dialect<\/property>\n\n        <!-- SQL sorgular\u0131n\u0131 konsola yazd\u0131r -->\n        <property name=\"hibernate.show_sql\">true<\/property>\n        <property name=\"hibernate.format_sql\">true<\/property>\n\n        <!-- Veritaban\u0131 \u015femas\u0131n\u0131 otomatik olarak olu\u015ftur\/g\u00fcncelle -->\n        <!-- create: Her seferinde \u015femay\u0131 silip yeniden olu\u015fturur (geli\u015ftirme i\u00e7in iyi). -->\n        <!-- update: \u015eemay\u0131 mevcut varl\u0131k s\u0131n\u0131flar\u0131na g\u00f6re g\u00fcnceller. -->\n        <!-- validate: \u015eemay\u0131 do\u011frular, e\u015fle\u015fmezse hata verir. -->\n        <!-- none: Hi\u00e7bir \u015fey yapmaz. -->\n        <property name=\"hibernate.hbm2ddl.auto\">update<\/property>\n\n        <!-- E\u015flenecek varl\u0131k s\u0131n\u0131flar\u0131 -->\n        <mapping class=\"com.example.hibernate.onetone.sharedpk.entity.Kullanici\"\/>\n        <mapping class=\"com.example.hibernate.onetone.sharedpk.entity.KullaniciDetay\"\/>\n        <mapping class=\"com.example.hibernate.onetone.fk.entity.Calisan\"\/>\n        <mapping class=\"com.example.hibernate.onetone.fk.entity.Pasaport\"\/>\n\n    <\/session-factory>\n<\/hibernate-configuration><\/code><\/pre>\n<p><strong>pom.xml (Gerekli Ba\u011f\u0131ml\u0131l\u0131klar)<\/strong><\/p>\n<pre><code class=\"language-xml\"><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-onetone-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>\n        <\/dependency>\n        <!-- MySQL Connector -->\n        <dependency>\n            <groupId>mysql<\/groupId>\n            <artifactId>mysql-connector-java<\/artifactId>\n            <version>8.0.33<\/version>\n        <\/dependency>\n        <!-- JPA API (Hibernate 5 ile birlikte gelir, ancak do\u011frudan eklemek iyi bir pratiktir) -->\n        <dependency>\n            <groupId>javax.persistence<\/groupId>\n            <artifactId>javax.persistence-api<\/artifactId>\n            <version>2.2<\/version>\n        <\/dependency>\n    <\/dependencies>\n<\/project><\/code><\/pre>\n<h3>CRUD \u0130\u015flemleri ve Test<\/h3>\n<p>\u015eimdi bu varl\u0131klar \u00fczerinde temel CRUD (Create, Read, Update, Delete) i\u015flemlerini nas\u0131l yapaca\u011f\u0131m\u0131za dair bir \u00f6rnek uygulama yazal\u0131m.<\/p>\n<pre><code class=\"language-java\">package com.example.hibernate.onetone.main;\n\nimport com.example.hibernate.onetone.fk.entity.Calisan;\nimport com.example.hibernate.onetone.fk.entity.Pasaport;\nimport com.example.hibernate.onetone.sharedpk.entity.Kullanici;\nimport com.example.hibernate.onetone.sharedpk.entity.KullaniciDetay;\nimport org.hibernate.Session;\nimport org.hibernate.SessionFactory;\nimport org.hibernate.cfg.Configuration;\n\nimport java.time.LocalDate;\n\npublic class OneToOneDemo {\n\n    public static void main(String[] args) {\n        \/\/ SessionFactory olu\u015fturma\n        SessionFactory factory = new Configuration()\n                .configure(\"hibernate.cfg.xml\")\n                .addAnnotatedClass(Kullanici.class)\n                .addAnnotatedClass(KullaniciDetay.class)\n                .addAnnotatedClass(Calisan.class)\n                .addAnnotatedClass(Pasaport.class)\n                .buildSessionFactory();\n\n        Session session = null;\n\n        try {\n            \/\/ Shared Primary Key \u00d6rne\u011fi (Kullanici - KullaniciDetay)\n            System.out.println(\"--- Kullanici - KullaniciDetay \u00d6rne\u011fi ---\");\n            session = factory.getCurrentSession();\n            session.beginTransaction();\n\n            \/\/ 1. Olu\u015fturma ve Kaydetme\n            Kullanici kullanici1 = new Kullanici(\"ahmet.yilmaz\", \"ahmet@example.com\");\n            KullaniciDetay detay1 = new KullaniciDetay(\"Ankara, T\u00fcrkiye\", \"555-1234567\");\n            kullanici1.setDetay(detay1); \/\/ Helper metot ile iki y\u00f6nl\u00fc ili\u015fki kurulur\n\n            System.out.println(\"Kullanici ve KullaniciDetay kaydediliyor...\");\n            session.save(kullanici1); \/\/ CascadeType.ALL sayesinde detay da kaydedilir\n            System.out.println(\"Kaydedilen Kullanici ID: \" + kullanici1.getId());\n            System.out.println(\"Kaydedilen KullaniciDetay ID: \" + detay1.getId()); \/\/ ID'ler ayn\u0131 olmal\u0131!\n\n            session.getTransaction().commit();\n            System.out.println(\"Kullanici ve KullaniciDetay ba\u015far\u0131yla kaydedildi.\");\n\n            \/\/ 2. Okuma\n            session = factory.getCurrentSession();\n            session.beginTransaction();\n            System.out.println(\"\\nKullanici ID \" + kullanici1.getId() + \" okunuyor...\");\n            Kullanici okunanKullanici = session.get(Kullanici.class, kullanici1.getId());\n            System.out.println(\"Okunan Kullanici: \" + okunanKullanici);\n            System.out.println(\"Okunan KullaniciDetay: \" + okunanKullanici.getDetay()); \/\/ LAZY oldu\u011fu i\u00e7in burada y\u00fcklenir\n            session.getTransaction().commit();\n            System.out.println(\"Kullanici ve KullaniciDetay ba\u015far\u0131yla okundu.\");\n\n            \/\/ 3. G\u00fcncelleme\n            session = factory.getCurrentSession();\n            session.beginTransaction();\n            System.out.println(\"\\nKullaniciDetay g\u00fcncelleniyor...\");\n            okunanKullanici.getDetay().setAdres(\"\u0130stanbul, T\u00fcrkiye\");\n            session.merge(okunanKullanici); \/\/ De\u011fi\u015fiklikler merge ile kaydedilir\n            session.getTransaction().commit();\n            System.out.println(\"KullaniciDetay ba\u015far\u0131yla g\u00fcncellendi.\");\n\n            \/\/ 4. Silme\n            session = factory.getCurrentSession();\n            session.beginTransaction();\n            System.out.println(\"\\nKullanici ID \" + kullanici1.getId() + \" siliniyor...\");\n            \/\/ CascadeType.ALL ve orphanRemoval=true sayesinde detay da silinir\n            session.delete(okunanKullanici);\n            session.getTransaction().commit();\n            System.out.println(\"Kullanici ve ili\u015fkili KullaniciDetay ba\u015far\u0131yla silindi.\");\n\n\n            \/\/ Foreign Key Tabanl\u0131 \u00d6rnek (Calisan - Pasaport)\n            System.out.println(\"\\n--- Calisan - Pasaport \u00d6rne\u011fi ---\");\n            session = factory.getCurrentSession();\n            session.beginTransaction();\n\n            \/\/ 1. Olu\u015fturma ve Kaydetme\n            Calisan calisan1 = new Calisan(\"Ay\u015fe\", \"Demir\");\n            Pasaport pasaport1 = new Pasaport(\"TR123456\", LocalDate.of(2020, 1, 1), LocalDate.of(2030, 1, 1));\n            calisan1.setPasaport(pasaport1); \/\/ Helper metot ile iki y\u00f6nl\u00fc ili\u015fki kurulur\n\n            System.out.println(\"Calisan ve Pasaport kaydediliyor...\");\n            session.save(calisan1); \/\/ CascadeType.ALL sayesinde pasaport da kaydedilir\n            System.out.println(\"Kaydedilen Calisan ID: \" + calisan1.getId());\n            System.out.println(\"Kaydedilen Pasaport ID: \" + pasaport1.getId()); \/\/ ID'ler farkl\u0131 olmal\u0131!\n\n            session.getTransaction().commit();\n            System.out.println(\"Calisan ve Pasaport ba\u015far\u0131yla kaydedildi.\");\n\n            \/\/ 2. Okuma\n            session = factory.getCurrentSession();\n            session.beginTransaction();\n            System.out.println(\"\\nCalisan ID \" + calisan1.getId() + \" okunuyor...\");\n            Calisan okunanCalisan = session.get(Calisan.class, calisan1.getId());\n            System.out.println(\"Okunan Calisan: \" + okunanCalisan);\n            System.out.println(\"Okunan Pasaport: \" + okunanCalisan.getPasaport()); \/\/ LAZY oldu\u011fu i\u00e7in burada y\u00fcklenir\n            session.getTransaction().commit();\n            System.out.println(\"Calisan ve Pasaport ba\u015far\u0131yla okundu.\");\n\n            \/\/ 3. G\u00fcncelleme\n            session = factory.getCurrentSession();\n            session.beginTransaction();\n            System.out.println(\"\\nPasaport bilgisi g\u00fcncelleniyor...\");\n            okunanCalisan.getPasaport().setSonGecerlilikTarihi(LocalDate.of(2035, 1, 1));\n            session.merge(okunanCalisan); \/\/ De\u011fi\u015fiklikler merge ile kaydedilir\n            session.getTransaction().commit();\n            System.out.println(\"Pasaport bilgisi ba\u015far\u0131yla g\u00fcncellendi.\");\n\n            \/\/ 4. Silme\n            session = factory.getCurrentSession();\n            session.beginTransaction();\n            System.out.println(\"\\nCalisan ID \" + calisan1.getId() + \" siliniyor...\");\n            \/\/ CascadeType.ALL ve orphanRemoval=true sayesinde pasaport da silinir\n            session.delete(okunanCalisan);\n            session.getTransaction().commit();\n            System.out.println(\"Calisan ve ili\u015fkili Pasaport ba\u015far\u0131yla silindi.\");\n\n\n        } catch (Exception exc) {\n            exc.printStackTrace();\n        } finally {\n            if (session != null && session.isOpen()) {\n                session.close();\n            }\n            factory.close();\n        }\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnek kod, hem payla\u015f\u0131lan birincil anahtar hem de yabanc\u0131 anahtar tabanl\u0131 One-to-One ili\u015fkiler i\u00e7in olu\u015fturma, okuma, g\u00fcncelleme ve silme i\u015flemlerini g\u00f6stermektedir. <code>SessionFactory<\/code> ve <code>Session<\/code> y\u00f6netimi, transaction&#8217;lar ve <code>cascade<\/code> mekanizmas\u0131n\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131 a\u00e7\u0131k\u00e7a g\u00f6r\u00fclmektedir.<\/p>\n<h3>Dikkat Edilmesi Gerekenler ve En \u0130yi Uygulamalar<\/h3>\n<p>*   <strong>Owning Side ve <code>mappedBy<\/code>:<\/strong> \u00c7ift y\u00f6nl\u00fc ili\u015fkilerde, bir taraf &#8220;owning side&#8221; (sahip taraf) olmal\u0131d\u0131r. Yabanc\u0131 anahtar bu tarafta bulunur. Di\u011fer taraf ise &#8220;non-owning side&#8221;d\u0131r ve <code>mappedBy<\/code> \u00f6zelli\u011fini kullanarak owning side&#8217;daki alan\u0131 referans g\u00f6sterir. <code>mappedBy<\/code> kullanmak, Hibernate&#8217;in gereksiz yabanc\u0131 anahtar s\u00fctunlar\u0131 olu\u015fturmas\u0131n\u0131 engeller ve ili\u015fki tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong><code>cascade<\/code> Stratejileri:<\/strong> <code>CascadeType.ALL<\/code> genellikle geli\u015ftirme s\u00fcrecini kolayla\u015ft\u0131rsa da, \u00fcretim ortamlar\u0131nda dikkatli kullan\u0131lmal\u0131d\u0131r. Gereksiz veya istenmeyen veri silmelerini \u00f6nlemek i\u00e7in daha spesifik <code>CascadeType<\/code> de\u011ferleri (\u00f6rne\u011fin <code>PERSIST<\/code>, <code>MERGE<\/code>, <code>REMOVE<\/code>) tercih edilebilir.<br \/>\n*   <strong><code>fetch<\/code> Stratejileri (EAGER vs. LAZY):<\/strong> Performans a\u00e7\u0131s\u0131ndan <code>FetchType.LAZY<\/code> (tembel y\u00fckleme) genellikle tercih edilir. <code>EAGER<\/code> (hevesli y\u00fckleme), ana varl\u0131kla birlikte ili\u015fkili varl\u0131klar\u0131n da hemen y\u00fcklenmesine neden olur, bu da \u00e7ok say\u0131da ili\u015fkili varl\u0131k oldu\u011funda performans\u0131 olumsuz etkileyebilir (N+1 problemi). <code>LAZY<\/code> y\u00fckleme, ili\u015fkili varl\u0131\u011fa ilk eri\u015fildi\u011finde y\u00fcklenmesini sa\u011flar.<br \/>\n*   <strong>N+1 Problemi:<\/strong> <code>LAZY<\/code> y\u00fckleme kullan\u0131l\u0131rken, her bir ana varl\u0131k i\u00e7in ayr\u0131 bir sorgu ile ili\u015fkili varl\u0131klar\u0131n y\u00fcklenmesi &#8220;N+1 problemi&#8221;ne yol a\u00e7abilir. Bu durum, \u00f6zellikle bir listedeki t\u00fcm ana varl\u0131klar\u0131n ili\u015fkili detaylar\u0131na eri\u015fildi\u011finde ortaya \u00e7\u0131kar. Bu sorunu \u00e7\u00f6zmek i\u00e7in JPQL\/HQL&#8217;deki <code>JOIN FETCH<\/code> veya Criteria API&#8217;deki <code>fetch<\/code> gibi mekanizmalar kullan\u0131labilir.<br \/>\n*   <strong>Bidirectional (\u00c7ift Y\u00f6nl\u00fc) ve Unidirectional (Tek Y\u00f6nl\u00fc) \u0130li\u015fkiler:<\/strong> Yukar\u0131daki \u00f6rnekler \u00e7ift y\u00f6nl\u00fc ili\u015fkileri g\u00f6stermektedir (hem <code>Kullanici<\/code>&#8216;dan <code>KullaniciDetay<\/code>&#8216;a hem de tersi). E\u011fer sadece tek bir y\u00f6nde ili\u015fkiye ihtiyac\u0131n\u0131z varsa (\u00f6rne\u011fin sadece <code>Kullanici<\/code>&#8216;dan <code>KullaniciDetay<\/code>&#8216;a eri\u015fim), ili\u015fkiyi tek y\u00f6nl\u00fc olarak tan\u0131mlamak (sadece owning side&#8217;\u0131 belirtmek ve <code>mappedBy<\/code> kullanmamak) kod karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 azaltabilir.<br \/>\n*   <strong><code>orphanRemoval = true<\/code>:<\/strong> Bu \u00f6zellik, bir ebeveyn varl\u0131ktan bir \u00e7ocuk varl\u0131k kald\u0131r\u0131ld\u0131\u011f\u0131nda (ili\u015fki kopar\u0131ld\u0131\u011f\u0131nda), \u00e7ocu\u011fun veritaban\u0131ndan otomatik olarak silinmesini sa\u011flar. Bu, gereksiz veri birikimini \u00f6nler ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korur. <code>CascadeType.REMOVE<\/code> ile benzer g\u00f6r\u00fcnse de, <code>orphanRemoval<\/code> ili\u015fkiden kopar\u0131lan varl\u0131klar\u0131 silerken, <code>CascadeType.REMOVE<\/code> ebeveyn varl\u0131k silindi\u011finde \u00e7ocuk varl\u0131klar\u0131 siler.<br \/>\n*   <strong>Veritaban\u0131 Tasar\u0131m\u0131:<\/strong> Hibernate mapping&#8217;leri, altta yatan veritaban\u0131 \u015femas\u0131yla uyumlu olmal\u0131d\u0131r. \u00d6zellikle bire-bir ili\u015fkilerde, yabanc\u0131 anahtar s\u00fctunlar\u0131n\u0131n <code>UNIQUE<\/code> k\u0131s\u0131tlamas\u0131na sahip olmas\u0131 kritik \u00f6neme sahiptir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Hibernate, Java uygulamalar\u0131nda ili\u015fkisel veritaban\u0131 etkile\u015fimlerini basitle\u015ftiren g\u00fc\u00e7l\u00fc bir ORM arac\u0131d\u0131r. Annotation&#8217;lar arac\u0131l\u0131\u011f\u0131yla, bire-bir ili\u015fkiler gibi karma\u015f\u0131k veritaban\u0131 yap\u0131lar\u0131n\u0131 Java nesneleri aras\u0131nda kolayca modelleyebilir ve y\u00f6netebiliriz. Bu makalede, payla\u015f\u0131lan birincil anahtar ve yabanc\u0131 anahtar tabanl\u0131 olmak \u00fczere iki ana bire-bir ili\u015fki modellemesi incelendi, gerekli annotation&#8217;lar detayland\u0131r\u0131ld\u0131 ve her iki senaryo i\u00e7in kapsaml\u0131 kod \u00f6rnekleri sunuldu.<\/p>\n<p>Do\u011fru mapping stratejilerini se\u00e7mek, <code>cascade<\/code> ve <code>fetch<\/code> t\u00fcrlerini bilin\u00e7li bir \u015fekilde kullanmak, performans ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fc a\u00e7\u0131s\u0131ndan hayati \u00f6nem ta\u015f\u0131r. Hibernate&#8217;in sundu\u011fu bu esneklik ve g\u00fc\u00e7, geli\u015ftiricilerin daha temiz, daha s\u00fcrd\u00fcr\u00fclebilir ve daha verimli uygulamalar geli\u015ftirmesine olanak tan\u0131r. Unutulmamal\u0131d\u0131r ki, her ne kadar Hibernate veritaban\u0131 detaylar\u0131n\u0131 soyutlasa da, altta yatan veritaban\u0131 prensiplerini ve optimizasyon tekniklerini anlamak, y\u00fcksek performansl\u0131 ve hatas\u0131z uygulamalar geli\u015ftirmek i\u00e7in kritik bir beceridir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Hibernate One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131\nGiri\u015f: Hibernate ve \u0130li\u015fkisel Veritabanlar\u0131\nModern yaz\u0131l\u0131m geli\u015fti","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":[1],"tags":[],"class_list":{"0":"post-33174","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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 One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hibernate One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131\" \/>\n<meta property=\"og:description\" content=\"Hibernate One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131 Giri\u015f: Hibernate ve \u0130li\u015fkisel Veritabanlar\u0131 Modern yaz\u0131l\u0131m geli\u015fti\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-30T12:41:27+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=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Hibernate One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131\",\"datePublished\":\"2025-10-30T12:41:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/\"},\"wordCount\":2289,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/\",\"name\":\"Hibernate One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-30T12:41:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Hibernate One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131\"}]},{\"@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 One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/","og_locale":"tr_TR","og_type":"article","og_title":"Hibernate One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131","og_description":"Hibernate One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131 Giri\u015f: Hibernate ve \u0130li\u015fkisel Veritabanlar\u0131 Modern yaz\u0131l\u0131m geli\u015fti","og_url":"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-30T12:41:27+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Hibernate One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131","datePublished":"2025-10-30T12:41:27+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/"},"wordCount":2289,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/","url":"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/","name":"Hibernate One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-30T12:41:27+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/hibernate-one-to-one-mapping-ornegi-detayli-bir-annotation-yaklasimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Hibernate One-to-One Mapping \u00d6rne\u011fi: Detayl\u0131 Bir Annotation Yakla\u015f\u0131m\u0131"}]},{"@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\/33174","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=33174"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33174\/revisions"}],"predecessor-version":[{"id":33175,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33174\/revisions\/33175"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}