DonanımHaber

JPA - Hibernate Konu Anlatımı - Türkçe (ChatGPT)







JPA, nesne yönelimli programlama yaklaşımını veritabanı işlemlerine uygulayarak, veritabanı işlemlerini daha anlaşılır ve bakımı daha kolay hale getirir. JPA, veritabanı tabloları ve Java sınıfları arasındaki ilişkileri yönetmek için kullanılan JPA işaretçileri sayesinde birçok veritabanı işlemini otomatikleştirir.

JPA ile veritabanı işlemlerini gerçekleştirmek için Entity Manager nesnesini kullanabilirsiniz. Entity Manager, veritabanı işlemlerini gerçekleştirmek için kullanılan bir nesnedir. EntityManager, JPA'nın sağladığı API'leri kullanarak veritabanı işlemlerini gerçekleştirir. EntityManager, veritabanı tablolarındaki kayıtları işlemek için CRUD işlemlerini (Create, Read, Update, Delete) destekler.

JPA, Entity sınıflarını kullanarak veritabanı tabloları ve Java sınıfları arasındaki ilişkileri yönetir. Bir Entity sınıfı, bir veritabanı tablosuna karşılık gelir. Entity sınıflarında, veritabanı tablosundaki her sütun bir özellik (property) olarak tanımlanır. Entity sınıflarında tanımlanan özellikler, veritabanındaki sütunlarla eşleştirilir.

JPA işaretçileri, veritabanı işlemleri için kullanılan özel işaretçilerdir. Bu işaretçileri kullanarak, bir Entity sınıfının bir veritabanı tablosuna karşılık geldiğini belirtebilirsiniz. Ayrıca, bir Entity sınıfındaki bir özelliğin bir veritabanı sütununa karşılık geldiğini belirtebilirsiniz.

JPA, bir veritabanından veri almak için JPQL (Java Persistence Query Language) adında özel bir sorgu dilini de destekler. JPQL, SQL benzeri bir sorgu dilidir. JPQL, bir Entity Manager üzerinden çalışır ve veritabanından veri çekmek için kullanılır.

JPA'nın avantajları arasında veritabanı işlemlerinin daha kolay ve anlaşılır hale getirilmesi, nesne yönelimli programlama yaklaşımının veritabanı işlemlerine uygulanması, ORM araçlarının desteklenmesi, JPQL'nin kullanımı ve daha az kod yazımı gibi konular yer alır.

JPA, veritabanı işlemlerinin daha kolay ve anlaşılır hale getirilmesi, daha az kod yazma ihtiyacı ve veritabanı işlemlerinin daha hızlı gerçekleştirilmesi gibi avantajları nedeniyle Java programlama dili için popüler bir ORM aracıdır. JPA (Java Persistence API), Java programlama dilinde bir ORM (Object-Relational Mapping) aracıdır. ORM araçları, veritabanı işlemlerini gerçekleştirmek için kullanılan SQL (Structured Query Language) sorgularını yazmak yerine, Java nesneleri arasındaki ilişkileri kullanarak veritabanı işlemlerini gerçekleştirmeyi mümkün kılar.

JPA, özellikle Java EE (Enterprise Edition) uygulamalarında kullanılmak üzere tasarlanmıştır. JPA'nın temel amacı, veritabanı tabloları ve Java sınıfları arasındaki ilişkileri yönetmektir. Bu sayede, veritabanı işlemleri için kullanılan SQL sorgularını yazmak zorunda kalmadan, Java kodu üzerinden veritabanı işlemlerini gerçekleştirebilirsiniz.

JPA, JDBC (Java Database Connectivity) kütüphanesine dayanır. Ancak, JDBC'de olduğu gibi doğrudan SQL sorguları yazmak yerine, JPA'da veritabanı işlemleri için bir Entity Manager kullanılır. Entity Manager, veritabanı işlemlerini gerçekleştirmek için kullanılan bir nesnedir. Veritabanı işlemleri, Entity Manager aracılığıyla gerçekleştirilir.

JPA'nın en büyük avantajlarından biri, nesne yönelimli programlama yaklaşımının veritabanı işlemlerine uygulanmasıdır. Bu sayede, veritabanı işlemleri için kullanılan kodların daha anlaşılır ve bakımı daha kolay olur. Ayrıca, veritabanı tabloları ve Java sınıfları arasındaki ilişkileri yönetmek için kullanılan JPA işaretçileri (annotations) sayesinde, birçok veritabanı işlemi otomatikleştirilir.

JPA, farklı ORM (Object-Relational Mapping) araçlarını destekler. Hibernate, EclipseLink ve OpenJPA gibi farklı ORM araçları, JPA'nın desteği altındadır. Bu sayede, bir uygulamanın veri tabanı işlemlerini yönetmek için kullanılan Hibernate veya EclipseLink gibi bir ORM aracını değiştirerek JPA'ya geçebilirsiniz.

JPA ayrıca, bir veritabanından veri almak için JPQL (Java Persistence Query Language) adında özel bir sorgu dilini de destekler. JPQL, SQL benzeri bir sorgu dilidir, ancak Java sınıfları ve JPA işaretçileri kullanarak veritabanından veri çekmeyi mümkün kılar.

Sonuç olarak, JPA, Java programlama dili için veritabanı işlemlerini yönetmek için kullanılan bir ORM aracıdır. JPA, JDBC kütüphanesine dayanır ve veritabanı işlemleri için Entity Manager nesnesini kullanır.

PA (Java Persistence API) işaretçileri, Java sınıfları ve veritabanı tabloları arasındaki ilişkileri tanımlamak için kullanılan özel işaretçilerdir

  1. @Entity: Bir Java sınıfının bir veritabanı tablosuna karşılık geldiğini belirtir.
  2. @Table: Bir Java sınıfının hangi veritabanı tablosuna karşılık geldiğini belirtir.
  3. @Id: Bir sınıf özelliğinin bir veritabanı tablosundaki birincil anahtar (primary key) sütunu olduğunu belirtir.
  4. @GeneratedValue: Birincil anahtar sütununun nasıl oluşturulacağını belirler.
  5. @Column: Bir sınıf özelliğinin bir veritabanı sütunu olduğunu belirtir.
  6. @Basic: Bir sınıf özelliğinin basit bir veritabanı sütunu olduğunu belirtir.
  7. @Temporal: Bir tarih veya zaman özelliğinin veritabanındaki tarih veya zaman sütunlarına nasıl eşleneceğini belirler.
  8. @Transient: Bir sınıf özelliğinin veritabanına kaydedilmemesi gerektiğini belirtir.
  9. @OneToOne: Bir sınıfın diğer bir sınıf ile bir-bir ilişkisi olduğunu belirtir.
  10. @OneToMany: Bir sınıfın diğer bir sınıf ile bir-çok ilişkisi olduğunu belirtir.
  11. @ManyToOne: Bir sınıfın diğer bir sınıf ile çok-bir ilişkisi olduğunu belirtir.
  12. @ManyToMany: İki sınıf arasında birçok-çok ilişkisi olduğunu belirtir.
  13. @JoinColumn: İki sınıf arasındaki ilişkide kullanılacak veritabanı sütununu belirtir.
  14. @JoinTable: İki sınıf arasındaki ilişki için kullanılacak ortak bir tablonun adını belirtir.
  15. @Index: Bir veritabanı tablosunda bir indeksin tanımlanmasını sağlar.
  16. @NamedQuery: Bir JPQL (Java Persistence Query Language) sorgusunun adını ve sorgusunu tanımlar.
  17. @NamedQueries: Birden fazla @NamedQuery tanımlar.
  18. @QueryHint: Bir JPQL sorgusu için veritabanı yönetim sistemine yönelik bir ipucu sağlar.
  19. @SqlResultSetMapping: SQL sorguları tarafından döndürülen sonuçların nasıl eşleneceğini belirler.
  20. @Cacheable: Bir sınıfın ve/veya bir sınıf özelliğinin önbelleğe alınması gerektiğini belirtir.
  21. @Cache: Bir önbellek için yapılandırma bilgilerini sağlar.
  22. @ElementCollection: Bir sınıf özelliğinin bir koleksiyon olarak tutulacağını belirtir.
  23. @Embedded: Bir sınıf özelliğinin başka bir sınıfın özellikleriyle birleştirileceğini belirtir.
  24. @Embeddable: Bir sınıfın diğer bir sınıfın özelliği olarak kullanılabileceğini belirtir.
  25. @AttributeOverride: @Embedded sınıfının özelliklerinin nasıl eşleneceğini belirler.
  26. @AttributeOverrides: Birden fazla @AttributeOverride tanımlar.
  27. @Transient: Bir sınıf özelliğinin geçici olduğunu ve veritabanına kaydedilmemesi gerektiğini belirtir.
  28. @Version: Bir sınıfın optimistik kilitlemesini belirtir.
  29. @Access: Bir sınıf özelliğinin nasıl erişilebileceğini belirtir.
  30. @DiscriminatorColumn: Kalıtımlı sınıfların nasıl ayırt edileceğini belirler.
  31. @DiscriminatorValue: Bir kalıtımlı sınıfın değerini belirler.
  32. @Inheritance: Kalıtım stratejisini belirler.
  33. @NamedQuery: JPQL sorgularının adını ve sorgusunu tanımlar.
  34. @NamedQueries: Birden fazla @NamedQuery tanımlar.
  35. @SecondaryTable: Bir sınıfın birincil tablosuna ek olarak kullanılacak bir veya daha fazla tablonun adını belirtir.
  36. @SecondaryTables: Birden fazla @SecondaryTable tanımlar.
  37. @SequenceGenerator: Bir sınıfın birincil anahtarının nasıl oluşturulacağını belirler.
  38. @TableGenerator: Bir sınıfın birincil anahtarının nasıl oluşturulacağını belirler.
  39. @ExcludeSuperclassListeners: Bir sınıfın ana sınıfının olay dinleyicilerinin kullanılmamasını belirtir.
  40. @ExcludeDefaultListeners: Bir sınıfın varsayılan olay dinleyicilerinin kullanılmamasını belirtir.
  41. @EntityListeners: Bir sınıfın olay dinleyicilerini belirtir.
  42. @PrePersist: Bir sınıf örneği kalıcı hale getirilmeden önce çalışacak işlemi belirtir.
  43. @PostPersist: Bir sınıf örneği kalıcı hale getirildikten sonra çalışacak işlemi belirtir.
  44. @PreUpdate: Bir sınıf örneği güncellenmeden önce çalışacak işlemi belirtir.
  45. @PostUpdate: Bir sınıf örneği güncellendikten sonra çalışacak işlemi belirtir.
  46. @PreRemove: Bir sınıf örneği silinmeden önce çalışacak işlemi belirtir.
  47. @PostRemove: Bir sınıf örneği silindikten sonra çalışacak işlemi belirtir.
  48. @PostLoad: Bir sınıf örneği veritabanından yüklendikten sonra çalışacak işlemi belirtir.
  49. @MapKeyColumn: Bir harita sınıfının anahtar sütununun adını belirtir.
  50. @MapKeyJoinColumn: Bir harita sınıfının anahtar sütununu belirleyen bir join column oluşturur.
  51. @OrderBy: Bir koleksiyonun veya sıralı bir haritanın nasıl sıralanacağını belirler.
  52. @Lob: Bir sınıf özelliğinin büyük verileri tutmak için kullanılabileceğini belirtir.
  53. @NamedNativeQuery: Native SQL sorgularının adını ve sorgusunu tanımlar.
  54. @NamedNativeQueries: Birden fazla @NamedNativeQuery tanımlar.
  55. @SqlResultSetMappings: Native SQL sorguları tarafından döndürülen sonuçların nasıl eşleneceğini belirler.
  56. @SqlResultSetMapping: Bir SQL sonucu kümesinin bir sınıfa nasıl eşleneceğini belirtir.
  57. @Convert: Bir sınıf özelliğinin veritabanına nasıl dönüştürüleceğini belirler.
  58. @Converter: Bir dönüştürücü sınıfını belirtir.
  59. @AttributeConverter: Bir sınıf özelliğinin nasıl dönüştürüleceğini belirleyen bir dönüştürücü sınıfını belirtir.
  60. @ElementCollection: Bir sınıf özelliğinin bir koleksiyon olarak tutulacağını belirtir.
  61. @CollectionTable: Bir @ElementCollection için tablo ismini belirler.
  62. @AssociationOverride: Kalıtım hiyerarşisinde bir ilişkiyi geçersiz kılar.
  63. @AttributeOverride: Bir gömülü sınıfın veya bir sınıfın özelliklerinin nasıl eşleneceğini belirler.
  64. @BatchSize: Hibernate tarafından kullanılan önbellekleme için yüksek bir sayı belirtir.
  65. @Proxy: Hibernate tarafından kullanılan proxy'lerin davranışını belirler.
  66. @NaturalId: Bir sınıf özelliğinin doğal bir kimlik olduğunu belirtir.
  67. @NaturalIdCache: Bir doğal kimlik için önbellekleme bilgilerini sağlar.
  68. @Immutable: Bir sınıfın değiştirilemez olduğunu belirtir.
  69. @Filter: Bir sınıfın veya koleksiyonun dinamik olarak filtrelenmesine izin verir.
  70. @Filters: Birden fazla @Filter tanımlar.
  71. @TypeDef: Bir özel tip tanımlar.
  72. @Type: Bir sınıf özelliğinin özel bir tiple ilişkili olduğunu belirtir.
  73. @Loader: Bir ilişki yükleyicisini belirtir.
  74. @FetchProfile: Bir yük profili tanımlar.
  75. @PersistenceContext: Bir EntityManager referansı almak için kullanılır.
  76. @PersistenceUnit: Bir EntityManagerFactory referansı almak için kullanılır.
  77. @Enumerated: Bir özellik için belirtilen enum tipinin nasıl eşleneceğini belirler.
  78. @SequenceGenerator: Bir sınıfın birincil anahtarının nasıl oluşturulacağını belirler.
JPA (Java Persistence API) yaşam döngüsü, bir nesnenin oluşturulmasından, veritabanına kaydedilmesine ve nihayetinde veritabanından silinmesine kadar geçen süreçleri kapsar. JPA yaşam döngüsü, JPA entegrasyonu olan herhangi bir uygulama tarafından kullanılabilir.

JPA yaşam döngüsü, şu aşamalardan oluşur:

  1. Yeni nesne oluşturma: Bir nesne oluşturulduğunda, bu nesne henüz JPA yönetimi altında değildir. Bu aşamada nesne "new" durumundadır.
  2. Yönetilen durum: Bir EntityManager tarafından yönetilen bir nesne oluşturulduğunda, JPA tarafından yönetilen bir duruma girer. Bu aşamada nesne "managed" durumundadır.
  3. Yönetilen durumda değişiklikler: Yönetilen bir nesnedeki değişiklikler, otomatik olarak EntityManager tarafından izlenir ve veritabanına yansıtılır. Bu aşamada nesne "managed" durumunda kalır.
  4. Yönetilen durumdan ayrılma: EntityManager'dan çıkarılan bir nesne, "detached" duruma geçer. Detached durumdaki nesne, EntityManager tarafından yönetilmemekte ve veritabanında değişiklikler yansıtılmamaktadır.
  5. Yönetilen duruma geri getirme: EntityManager tarafından yönetilmeyen bir nesne, EntityManager tarafından tekrar yönetilen bir nesne haline getirilebilir. Bu durumda nesne tekrar "managed" durumuna geçer.
  6. Silme: EntityManager tarafından yönetilen bir nesne silindiğinde, nesne "removed" durumuna geçer.
  7. Veritabanına kaydetme: EntityManager tarafından yönetilen bir nesne veritabanına kaydedildiğinde, nesne "persistent" durumuna geçer.
  8. Veritabanından silme: EntityManager tarafından yönetilen bir nesne veritabanından silindiğinde, nesne "transient" durumuna geçer.


JPA yaşam döngüsü, EntityManager nesnesinin yönettiği nesnelerin her birinde gerçekleşir ve JPA özelliklerini kullanarak nesnenin durumunu izler. Bu süreç, JPA entegrasyonu olan herhangi bir uygulama tarafından kullanılabilir ve nesnelerin veritabanı ile etkileşimini yönetmek için çok önemlidir.

Hibernate, bir JPA (Java Persistence API) uygulamasıdır ve JPA yaşam döngüsünü takip eder. Hibernate'in yaşam döngüsü, bir nesnenin oluşturulmasından, veritabanına kaydedilmesine ve nihayetinde veritabanından silinmesine kadar geçen süreçleri kapsar. Hibernate yaşam döngüsü, bir Hibernate uygulamasında kullanılabilir.

Hibernate yaşam döngüsü, şu aşamalardan oluşur:


  1. Yeni nesne oluşturma: Bir nesne oluşturulduğunda, bu nesne henüz Hibernate yönetimi altında değildir. Bu aşamada nesne "transient" durumundadır.


  1. Kalıcı nesne: Bir nesne Hibernate tarafından yönetildiğinde, Hibernate tarafından yönetilen bir duruma girer. Bu aşamada nesne "persistent" durumundadır.

  2. Yönetilen durumda değişiklikler: Yönetilen bir nesnedeki değişiklikler, Hibernate tarafından izlenir ve veritabanına yansıtılır. Bu aşamada nesne "persistent" durumunda kalır.

  3. Yönetilen durumdan ayrılma: Session'dan çıkarılan bir nesne, "detached" duruma geçer. Detached durumdaki nesne, Hibernate tarafından yönetilmemekte ve veritabanında değişiklikler yansıtılmamaktadır.
    Ayrılmış durum için kullanılan yöntemler şunlardır:
            session.detach(e);
            session.evict(e);
            session.clear();
            session.close();




// Transient State
Employee e = new Employee("Neha Shri Rudra", 21, 180103);

// Persistent State 
session.save(e); 


// Detached State
session.close(); 
            

4.Yönetilen duruma geri getirme: Session tarafından yönetilmeyen bir nesne, Session tarafından tekrar yönetilen bir nesne haline getirilebilir. Bu durumda nesne tekrar "persistent" durumuna geçer.


5.Silme: Session tarafından yönetilen bir nesne silindiğinde, nesne "removed" durumuna geçer.


6.Veritabanına kaydetme: Session tarafından yönetilen bir nesne veritabanına kaydedildiğinde, nesne "persistent" durumuna geçer
7.Veritabanından silme: Session tarafından yönetilen bir nesne veritabanından silindiğinde, nesne "transient" durumuna geçer.

Hibernate yaşam döngüsü, Session nesnesinin yönettiği nesnelerin her birinde gerçekleşir ve Hibernate özelliklerini kullanarak nesnenin durumunu izler. Bu süreç, Hibernate entegrasyonu olan herhangi bir uygulama tarafından kullanılabilir ve nesnelerin veritabanı ile etkileşimini yönetmek için çok önemlidir.









Hibernate'de persistent durumunda olan nesnelerdeki değişiklikler, Hibernate tarafından otomatik olarak takip edilir ve veritabanına yansıtılır. Ancak bu işlem, bir işlem sırasında farklı noktalarda gerçekleşebilir.

Genellikle, bir Hibernate işlemi, bir transaction (işlem) içinde gerçekleştirilir. Bir transaction içinde, nesnelerin veritabanına yansıtılması tam olarak kontrol edilebilir. Bir transaction içinde, veritabanındaki herhangi bir değişiklik (oluşturma, güncelleme, silme vb.) geri alınabilir.

Persistent nesnelerde yapılan değişiklikler, transaction'in commit (onaylama) işlemi gerçekleştirildiğinde veritabanına yansıtılır. Örneğin, bir nesne üzerinde yapılan değişiklikler, Session'ın flush() metodu çağrıldığında, transaction commit edildiğinde veya Session kapatıldığında veritabanına yansıtılır.

Hibernate, bir Session içindeki tüm persistent nesneleri otomatik olarak takip eder ve değişiklikleri otomatik olarak veritabanına yansıtır. Bu sayede, geliştiricinin değişiklikleri elle takip etmesine gerek yoktur.

Ancak, bazı durumlarda, bazı değişikliklerin otomatik olarak veritabanına yansıtılmasını istemeyebilirsiniz. Bu durumlarda, Session'ın setFlushMode() metodu kullanılarak flush mode (sıfırlama modu) ayarlanabilir. Bu modda, otomatik flush işlemi devre dışı bırakılabilir veya flush işlemi, geliştiricinin belirlediği bir zaman diliminde gerçekleştirilebilir.

Özetle, Hibernate'de persistent durumunda olan nesnelerde yapılan değişiklikler, Session'ın flush işlemi gerçekleştirdiği anda veya transaction commit edildiğinde veritabanına yansıtılır. Ancak, Session'ın flush modu ayarlanarak, flush işlemi geciktirilebilir veya devre dışı bırakılabilir.

Hibernate'de flush() metodunu veya commit() metodunu çağırmazsam nesne yine de veritabanına kaydedilir mi?







Hibernate'de flush() veya commit() metotlarının çağrılmaması durumunda, Hibernate otomatik olarak bir flush işlemi gerçekleştirir. Bu flush işlemi, nesnenin veritabanına kaydedilmesini sağlar.

Ancak, otomatik flush işleminin zamanlaması, bir Session'in flush moduna bağlıdır. Hibernate'de flush modu, Session'ın flush işleminin ne zaman gerçekleştirileceğini kontrol eder. Varsayılan olarak, Hibernate, transaction commit edildiğinde veya bir sorgu çalıştırıldığında otomatik flush işlemi gerçekleştirir.

Ancak, flush modu değiştirilerek flush işlemi zamanlaması kontrol edilebilir. Örneğin, Session'ın setFlushMode() metodu kullanılarak FlushModeType.MANUAL moduna ayarlandığında, otomatik flush işlemi devre dışı bırakılır. Bu durumda, nesnenin veritabanına kaydedilmesi için flush() metodu çağrılması gerekir.

Özetle, Hibernate'de, Session'ın flush() veya commit() metotları çağrılmadığında bile, Hibernate otomatik olarak bir flush işlemi gerçekleştirir ve nesnenin veritabanına kaydedilmesini sağlar. Ancak, flush modu değiştirilerek flush işlemi zamanlaması kontrol edilebilir ve flush() metodu çağrılmadan önce veritabanına kaydetmek için flush işlemi manuel olarak gerçekleştirilmelidir.

Hibernate'de removed state'inde bulunan bir nesne veritabanından otomatik olarak silinir mi?

Hibernate'de removed state'inde bulunan bir nesne, veritabanından otomatik olarak silinmez. Removed state, sadece nesnenin Hibernate tarafından veritabanından silinmek üzere işaretlendiği durumdur. Nesnenin veritabanından silinmesi için, işaretlenmiş olmasına rağmen, Hibernate tarafından bir delete işlemi gerçekleştirilmesi gerekir.

Removed state'e geçirilen bir nesne, Session tarafından yönetilen nesneler listesinden kaldırılır ve Hibernate tarafından veritabanından silinmek üzere işaretlenir. Bu, nesnenin Session tarafından yönetilmediği anlamına gelir, ancak nesne henüz veritabanından silinmemiştir.

Hibernate'de veritabanından bir nesneyi silmek için, Session.delete() metodu kullanılır. Bu metot, veritabanındaki nesneyi siler ve Hibernate Session'dan da kaldırır. Bu yöntem çağrılmadan önce, nesnenin persistent state'de olması gerekir.

Özetle, Hibernate'de removed state'inde bulunan bir nesne, veritabanından otomatik olarak silinmez. Nesnenin veritabanından silinmesi için, Hibernate tarafından delete() metodu çağrılması gerekir.


Converting Persistent State to Removed State

Example

// Java Pseudo code to Illustrate Remove State
 
// Transient State
Employee e = new Employee();     
Session s = sessionfactory.openSession();
e.setId(01);


// Persistent State
session.save(e)  

// Removed State                 
session.delete(e);


Hibernate'de detach ile evict arasındaki fark nedir?

Hibernate'de detach() ve evict() metotları, bir nesnenin Session yönetiminden kaldırılmasını sağlar. Ancak, bu iki metot arasında bazı farklılıklar vardır.

detach() metodu, bir nesnenin Session ile olan bağlantısını keser, ancak nesne Hibernate Session yönetiminde kalır. Yani, nesne, detached (bağlantısı kesilmiş) bir nesne haline gelir, ancak hala Session içinde yer alır ve Session'ın kontrolü altındadır. Detach() metodu çağrıldığında, nesnenin Hibernate Session yönetiminden kaldırılması, nesnenin veritabanındaki durumunu etkilemez.

Öte yandan, evict() metodu, bir nesnenin Session yönetiminden kaldırılmasını ve Session tarafından tamamen unutulmasını sağlar. Yani, nesne Hibernate Session yönetiminden tamamen kaldırılır ve nesne artık Session tarafından yönetilmez. Evict() metodu çağrıldığında, nesnenin Hibernate Session yönetiminden kaldırılması, nesnenin veritabanındaki durumunu etkilemez. Ancak, bir nesne evict edildikten sonra, Session tarafından yeniden yönetilmek istenirse, nesne tekrar yüklenmesi gerekir.Genel olarak, detach() metodu, nesnenin Session yönetiminden çıkarılmasını sağlar, ancak nesne ile ilgili verilerin Session'dan kaldırılmamasını sağlar. Bu nedenle, nesne ile ilgili değişiklikler, daha sonra yeniden yönetildiğinde veritabanına kaydedilebilir. Öte yandan, evict() metodu, nesneyi tamamen unutulmuş hale getirir ve yeniden yüklenene kadar nesnenin değişiklikleri kaydedilmez. Bu nedenle, evict() metodu, nesnenin Session yönetiminden kalıcı olarak kaldırılması gerektiği durumlarda kullanılır.



Hibernate'de detach edilmiş bir nesne tekrar sesiona nasıl eklenir?

Hibernate'de detach edilmiş bir nesne, daha sonra tekrar Session'a eklemek için merge() veya update() metotları kullanılabilir. Bu iki metot arasındaki farklılıklar şunlardır:

Merge() metodu, detach edilmiş nesne üzerinde yapılan değişiklikleri korur ve yeni bir persistent nesne oluşturur. Detach edilmiş nesne, merge edildikten sonra, Hibernate Session'ın yönetimine geri alınır.

MyEntity detachedEntity = ...;

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

MyEntity persistentEntity = (MyEntity) session.merge(detachedEntity);

tx.commit();

session.close();


Update() metodu, detach edilmiş nesnenin verilerini veritabanından yeniden yükler. Bu nedenle, detach edilmiş nesne üzerinde yapılan değişiklikler kaybedilir ve veritabanındaki verilere göre nesne yeniden oluşturulur.


MyEntity detachedEntity = ...;

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

session.update(detachedEntity);

tx.commit();

session.close();

Özetle, detach edilmiş bir nesneyi tekrar Hibernate Session'a eklemek için, merge() veya update() metotları kullanılabilir. Merge() metodu, nesnenin değişikliklerini korurken, update() metodu, nesneyi veritabanından yeniden yükleyerek, değişiklikleri kaybeder.




Hiç yorum yok

Rastgele İçerik

© tüm hakları saklıdır
made with by templateszoo