Merhaba arkadaşlar. Bu yazımızın konusu EJB’nin bir diğer alanı olan Persistence konusu olacak.
Persistence konusu aslında oldukça geniş bir konu. Bu konuda yazılmış bazı çatılar bulunmakta ve işlemler kolaylaştırılmaya çalışılmaktadır. JPA ve Hibernate bu ORM çatılarının en meşhurlarıdır. Bu yazı içinde bir EJB sınıfı ile JPA çatısı kullanarak veritabanına bağlantı sağlayacağız. Bu bağlantı sağlama işlemini EJB üzerinde çalıştığımız için @PersistenceContext notasyonu kullanılarak yapacağız. Notasyon kullanmadan EntityManagerFactory ile EntityManager nesnesi eldesi işleminde EJB container’a sahip sunucuya ihtiyaç olmadığından o durum konumuzun dışında. Persistence konusu hakkında daha fazla bilgi için kod5.net/jpa-00-0-ormjpa-nedir-giris-ve-netbeans-ortaminda-kurulum yazısını okumanızı tavsiye ederim. Bu yazı EJB ve JPA’nın birlikte kullanımına örnek teşkil eden bir yazı olacak.
Benim MySql veritabanım içinde JSFDersleri diye bir veritabanım var ve içinde Person adında bir tablom var. İçinde barındırdığı kayıtlar da şu şekilde:
Şimdi biz bu kayıtları EJB sınıfımızdan veritabanına bağlanarak alıcaz. İlk olarak yapmamız gereken localhost:4848‘e gidip veritabanımızı Glassfish sunucumuza tanıtmamız gerekiyor. Şu adımları uygulayarak veritabanını tanıtalım:
- Soldaki menüden JDBC altından JDBC Connection Pools’a tıklayın.
- New butonuna tıklayın, bir Pool Name girin, Resource Type’dan DataSource’u seçin, Database Driver Vendor’dan MySql’i seçin. Next butonuna tıklayın.
- Sayfayı aşağı kaydırın, Additional Properties kısmından URL,Password ve User kısımlarını doldurun. Ctrl + F yapıp ararsanız daha kolay bulabilirsiniz.
- Finish deyip bu aşamayı tamamlayın.
- JDBC altından JDBC Resources’a tıklayın. New butonuna tıklayın. JNDI Name istediğiniz bir şeyi atayın. JNDI Name bize lazım olacak. Pool Name kısmında az önce Connection Pools içinde tanımladığınız Pool Name’i atayın.
- OK butonuna tıklayıp işlemi bitirin.
Şimdi sıra projeye Persistence Unit desteği eklemeye geldi. Nasıl Persistence Unit ekleneceğini bazı yazılarda anlatmıştım. Şu yazılardan IDE’nize uygun yazıyı okuyup desteği ekleyebilirsiniz.
- JPA-00-0-ORM&JPA Nedir? Giriş ve NetBeans Ortamında Kurulum
- JPA-00-1-Eclipse Ortamında Kurulum
- JPA-00-2-IntelliJ Idea Ortamında Kurulum
Persistence desteği ekledikten sonra bu tablonun Java projesine haritalanması gerekiyor. Yukarıdaki yazılardan uygun olanı okuduğunuzda onu da yapabiliyor olacaksınız. 🙂 EJB teknolojisi içinde bu işlemde oldukça kolaylaştırılmış ve persistence mekanizması ile Entity sınıflarının basit POJO’lar olması sağlanmış. Bendeki haritalanmış sınıf şöyle:
Person.java
package entityPackage; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; /** * Created by ilkaygunel on 12/09/15. */ @Entity public class Person { private int id; private String name; private String surname; @Id @Column(name = "id", nullable = false, insertable = true, updatable = true) public int getId() { return id; } public void setId(int id) { this.id = id; } @Basic @Column(name = "name", nullable = false, insertable = true, updatable = true, length = 45) public String getName() { return name; } public void setName(String name) { this.name = name; } @Basic @Column(name = "surname", nullable = false, insertable = true, updatable = true, length = 45) public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (id != person.id) return false; if (name != null ? !name.equals(person.name) : person.name != null) return false; if (surname != null ? !surname.equals(person.surname) : person.surname != null) return false; return true; } @Override public int hashCode() { int result = id; result = 31 * result + (name != null ? name.hashCode() : 0); result = 31 * result + (surname != null ? surname.hashCode() : 0); return result; } }
Sınıfı haritalama işlemini yaptıktan sonra şimdi persistence.xml dosyanızı açın. Persistence Unit’in transaction-type özelliğini kontrol edin. Eğer yoksa <persistence-unit> etiketinde bu özelliği tanımlayın ve JTA ataması yapın. Akabinde persistence-unit etiketinin içinde bir de <jta-data-source> etiketi açın ve parametre olarak az önce Glassfish’e veritabanını tanıtırken verdiğiniz JNDI Name’i verin. Benim persistence.xml’im şöyle:
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1"> <persistence-unit name="EjbPersistenceUnit" transaction-type="JTA"> <jta-data-source>JSFDersleriJNDI</jta-data-source> <class>entityPackage.Person</class> <properties> <property name="eclipselink.jdbc.url" value="jdbc:mysql://localhost:3306/JSFDersleri"/> <property name="eclipselink.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="eclipselink.jdbc.user" value="ilkay"/> <property name="eclipselink.jdbc.password" value="ilkgunel12345"/> </properties> </persistence-unit> </persistence>
Şimdi artık herşeyimiz hazır, kodumuzu yazabiliriz.
EJBInterface.java
package ejbPackage; import entityPackage.Person; import java.util.List; /** * Created by ilkaygunel on 12/09/15. */ public interface EJBInterface { public List<Person> getPersonList(); }
EJB Interface’imiz içinde Person tipinde bir listeyi sonuç olarak döndürecek metot tanımladık.
EJBClass.java
package ejbPackage; import entityPackage.Person; import javax.ejb.Stateless; import javax.persistence.*; import java.util.List; @Stateless public class EJBClass implements EJBInterface{ @PersistenceContext(unitName = "EjbPersistenceUnit") private EntityManager em; @Override public List<Person> getPersonList() { TypedQuery<Person> personQuery=em.createQuery("SELECT p FROM Person p",Person.class); List<Person> personList=personQuery.getResultList(); return personList; } }
EJB sınıfımız içinde ilk sınıfımızı @Stateless notasyonu ile işaretleyip istemciye özel olmadığını ve bir nevi herkese hizmet veren Session Bean olacağını tanımladık. Akabinde sınıfımızı an önce hazırladığımız Interface’den Implement ettik. Sınıfımızın hemen içinde @PersistenceContext notasyonu ile işaretlenmiş bir EntityManager nesnesi tanımlıyoruz. @PersistenceContext notasyonu EntityManager nesnesinin yönetimini sunucuya bırakır ve bizi bir yükten daha kurtarır. Bu notasyona parametre olarak verdiğimiz unitName özelliği persistence.xml içinde tanımlanmış persistence-unit’in ismidir.
Kodumuza Interface içindeki metodu Override ederek devam ediyoruz ve veritabanından veri getirecek kodları yazıyoruz. createQuery metodu ile JPQL ifadesini yazıyoruz ve hangi Entity sınıfının kullanılacağını söylüyoruz. createQuery metodundan dönen sonucu da kendi tanımladığımız TypedQuery nesnesine atıyoruz. personQuery.getResultList diyerek JPQL kodunu çalıştırıyoruz ve veritabanından dönen sonucu liste halinde alıyoruz. Dönen sonucu da kendi tanımladığımız listeye atıyoruz. Listeyi return ederek metotdan çıkıyoruz.
BeanClass.java
package beanPackage; import ejbPackage.EJBInterface; import entityPackage.Person; import javax.ejb.EJB; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import java.util.List; /** * Created by ilkaygunel on 12/09/15. */ @ManagedBean @SessionScoped public class BeanClass { @EJB private EJBInterface ejbInterfaceObject; public List<Person> getPersonList() { return ejbInterfaceObject.getPersonList(); } }
Managed Bean kodumuz içinde EJB sınıfındaki metodu return ifadesi ile çağırıyoruz. Böylece listeyi direk elde edip döndürmüş oluyoruz.
index.xhtml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:p="http://primefaces.org/ui" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <title>EJB Persistence Kullanımı</title> </h:head> <h:body> <h:form> <p:dataTable style="width: 300px;" value="#{beanClass.personList}" var="personObject"> <p:column> <f:facet name="header"> ID </f:facet> <h:outputLabel value="#{personObject.id}"/> </p:column> <p:column> <f:facet name="header"> İsim </f:facet> <p:outputLabel value="#{personObject.name}"/> </p:column> <p:column> <f:facet name="header"> Soyisim </f:facet> <p:outputLabel value="#{personObject.surname}"/> </p:column> </p:dataTable> </h:form> </h:body> </html>
Index kodumuz içinde de DataTable ile verileri alıp ekrana yazdırıyoruz.
Ekran Çktısı
Bu yazıda da bu kadar arkadaşlar. Basit bir kullanımla EJB, JPA ve JSF teknolojilerini birlikte kullandık. Sormak istedikleriniz olursa [email protected] adresinden ya da yorum kısmından sorabilirsiniz. Gelecek yazıda görüşmek üzere sağlıcakla kalın.
Elinize sağlık güzel bir örnekleme ile anlatmışsınız.Merak ettiğim bir konu var EJB’yi neden tercih etmeliyiz?Özellikle ne için kullanabiliriz? Şöyle baktığımda Spring MVC ile aynı işlemlerde yapılabiliyor ikisi arasında bir ayrıştırma yapamıyorum, rica etsem biraz açıklayabilir misiniz?
Teşekkürler.