Merhaba arkadaşlar. Bu yazımızda JPA’nın en temel taşları olan EntityManagerFactory ve EntityManager konularını öğreneceğiz.
Bizler JPA’da veritabanı ile ilişki kurabilmek için EntityManager nesnesine her zaman ihtiyaç duyarız. EntityManagerFactory nesnesini ise istersek kullanabiliriz istersek de hiç kullanmadan bir sunucu yardımı ile işin içinden çıkabiliriz. Burada aslında EntityManagerFactory nesnesini ne zaman kullanmamız gerektiğine projenin tipine göre karar verilebilir. Örneğin bir Java SE projesinde işlemler EntityManagerFactory ile yapılabilir ama bir Java EE projesinde EntityManagerFactory yerine iş sunucuya devredilebilir.
EntityManagerFactory&EntityManager
Eğer EntityManagerFactory sınıfı yardımı ile bir EntityManager nesnesi elde etmek istersek öncelikle persistence.xml dosyamızın içerisinde yer alan <persistence-unit> etiketimizin name özelliğine hangi değerin atandığını bilmemiz lazım. Burada JPA’ya giriş yaparken projeye Persistence Unit eklemeyi anlatmıştım. Bir projeye Persistence Unit eklenirken eğer biz bir müdahele yapmazsak projenin adına PU eklemesi yapılarak bir persistence unit name oluşturuluyor. İstersek Persistence Unit ekleme aşamasında istersek dosya oluştuktan sonra gidip isimlendirme yaparak kendimize özgü bir Persistence Unit oluşturabiliriz. Benim bir projemde kullandığım persistence.xml dosyası şu şekilde:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="BlogProjesi" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <class>com.ilkgunel.entities.Uyeler</class> <class>com.ilkgunel.entities.Yazilar</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/BlogProjesi?useUnicode=true&characterEncoding=UTF-8"/> <property name="javax.persistence.jdbc.password" value="ilkay1234."/> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="javax.persistence.jdbc.user" value="ilkay"/> <property name="javax.persistence.schema-generation.database.action" value="create"/> </properties> </persistence-unit> </persistence>
Burada gördüğünüz gibi persistence-unit etiketimiz var ve onun name özelliğine BlogProjesi ataması yapılmış. Biz EntityManagerFactory nesnesi elde ederken bu name özelliğine atanan değeri kullanacağız. Akabinde bu EntityManagerFactory nesnesinden de bir EntityManager nesnesi üreteceğiz. Örnek kodumuza bakalım:
EntityManagerFactory emf=Persistence.createEntityManagerFactory("BlogProjesi"); EntityManager em=emf.createEntityManager();
EntityManagerFactory türünden bir nesne türetirken buna javax.persistence paketi altındaki Persistence sınıfında yer alan createEntityManagerFactory metodundan dönen sonucu atıyoruz ve bu sonuç elde etme işlemi sırasında metoda parametre olarak Persistence Unit’in ismini atıyoruz. Benim persistence.xml’imin içindeki persistence-unit’in adı BlogProjesi olduğu için metoda parametre olarak BlogProjesini verdim. Akabinde elde ettiğimiz EntityManagerFactory nesnesinden createEntityManager metodu ile bir EntityManager nesnesi elde edip bunu kendi EntityManager nesnemize atıyoruz.
Artık veritabanı ile ilişki kurabilecek nesnemiz hazır halde.
PersistenceContext&EntityManager
EntityManagerFactory kullanmak istemediğimiz zaman @PersistenceContext notasyonu kullanarak işi sunucuya devredebiliriz. Bunu yapmak için öncelikle persistence.xml içindeki transaction-type özelliğine JTA ataması yapmamız gerekiyor. Bu atamanın ardından bir de JTA veri kaynağına (data source) ihtiyacımız var. Eğer sunucu olarak GlassFish kullanırsak localhost:4848 adresine gidip sol kısımdan önce JDBC Connection Pools bölümünden veritabanımızı kaydettirmemiz lazım. Daha sonra bu connection pool ile JDBC Resources kısmında bir kaynak tanımlaması yapmamız gerekiyor. Bu işlemlerin ardından GlassFish için JTA ve @PersistenceContext kullanımına hazır hale geliyoruz.
Eğer sunucu olarak Apache Tom EE kullanırsak yukarıdaki işlemlere gerek kalmıyor, projeye Persistence Unit eklerken JTA Data Source’u kendisi oluşturuyor. Bu nedenle @PersistenceContext notasyonumuzu direk kullanabiliyoruz. Apache Tomcat için ise benim bildiğim kadarı ile bu işlemler geçerli olamıyor.
Kullanım için örnek kodumuz şöyle olur:
import javax.persistence.PersistenceContext; @PersistenceContext(unitName = "BlogProjesi") private EntityManager em;
Gerekli sınıfı kendi sınıfımıza ekledikten sonra @PersistenceContext notasyonu ile EntityManager nesnesini işaretliyoruz ve @PersistenceContext notasyonuna parametre olarak persistence-unit etiketinin name özelliğini veriyoruz. Böylece bu EntityManager nesnesinin yönetimi sunucuya bırakılmış oluyor ve işler biraz daha kolaylaştırlıyor.
Bu yazıda da bu kadar arkadaşlar. Gelecek yazıda yukarıda anlattığım iki şekilde de veritabanı ile bu EntityManager nesnesini etkileştirip işlemler yapacağız. Bir sonraki yazıya kadar sağlıcakla kalın.