Spring – 21 – JPA – 01
Merhaba Arkadaslar
Bu bolumde Spring ve JPA’nin beraber kullanimini inceleyecegiz. Spring , JDBC icin destek sagladigi gibi JPA icin de destek saglamaktadir.
Burada JPA konusunu detayli olarak tekrar ele almayacagim. JPA konusu icin bu konudaki yazilarimi inceleyebilirsiniz ;
EclipseLink/Hibernate JPA
Dependency
Oncelikle pom.xml dosyamiza spring – orm , JPA ve EclipseLink jarlari icin gerekli dependency tanimlarini ekleyelim.
pom.xml
<properties> .... <eclipselink.version>2.6.4</eclipselink.version> ... </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>${eclipselink.version}</version> </dependency> </dependencies>
Configuring JPA EntityManagerFactory
Hatirlayacagimiz gibi oncelikle Persistence sinifi yardimi ile EntityManagerFactory olusturmamiz gerekliydi. Spring , bir kac tane EntityManagerFactory konfigurasyonu destekler.
LocalEntityManagerFactoryBean
LocalEntityManagerFactoryBean , EntityManagerFactory olusturmak icin kullanabilecegimiz en basit yaklasimdir. Basit stand-alone uygulamalar icin bu yaklasim yeterli olacaktir.
Model
Oncelikle Entity sinifimizi yazalim. Onceki JDBC orneklerimizde Person sinifini kullandik burada da ayni sinifi kullanalim. @Entity , @Id ve @GeneratedValue annotation’lari ile Entity tanimini gerceklestirelim.
Person.java
package _27.jpa.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.TABLE) private int id; private String name; private String surname; private int salary; public Person() { super(); } public Person(String name, String surname, int salary) { super(); this.name = name; this.surname = surname; this.salary = salary; } //getters and setters ... }
XML Configuration
JPA konfigurasyonlari icin kullanacagimiz XML dosyamiz META-INF klasoru altinda olmalidir.
persistence.xml konfigurasyon dosyasi ile ilgili aciklamalari JPA yazilarinda bulabilirsiniz.
Onceki bolumlerde “resources” adinda bir source file olusturmustuk. META-INF klasorumuz burada olabilir.
persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence 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" version="2.1"> <persistence-unit name="SpringJPA_PU" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <!-- default persistence provider --> <class>_27.jpa.model.Person</class> <properties> <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver" /> <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:xe" /> <property name="javax.persistence.jdbc.user" value="Levent" /> <property name="javax.persistence.jdbc.password" value="123456" /> <!-- <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/springjdbc?serverTimezone=UTC" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="" /> --> <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> <property name="eclipselink.logging.level" value="OFF" /> </properties> </persistence-unit> </persistence>
27.jpa.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="entityManagerFactoryId" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> <property name="persistenceUnitName" value="SpringJPA_PU"></property> </bean> <bean id="personDAOImplId" class="_27.jpa.dao.PersonDAOImpl"> <property name="entityManagerFactory" ref="entityManagerFactoryId" /> </bean> </beans>
Data Access Object (DAO) / Data Layer
PersonDAO.java
PersonDAO arabirimimizde kayit eklemek (insert), id numarasina gore kaydi getirmek (getPersonById) , tum kayitlari getirmek (getAllPersons) , mevcut kaydi guncellemek (update) , kaydi silmek (delete) amaclari icin metotlar tanimlandik.
package _28.jpa.dao; import java.util.List; import _28.jpa.model.Person; public interface PersonDAO { public void insert(Person person); public Person getPersonById(int id); public List<Person> getAllPersons(); public void update(Person person); public void delete(int id); }
PersonDAOImpl.java
package _28.jpa.dao; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.TypedQuery; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import _28.jpa.model.Person; @Repository("personDAOImpl") public class PersonDAOImpl implements PersonDAO { private EntityManager entityManager; @Autowired public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) { entityManager = entityManagerFactory.createEntityManager(); } @Override public void insert(Person person) { entityManager.getTransaction().begin(); entityManager.persist(person); entityManager.getTransaction().commit(); } @Override public Person getPersonById(int id) { return entityManager.find(Person.class, id); } @Override public List<Person> getAllPersons() { TypedQuery<Person> query = entityManager.createQuery("Select e from Person e", Person.class); return query.getResultList(); } @Override public void update(Person person) { entityManager.getTransaction().begin(); entityManager.persist(person); entityManager.getTransaction().commit(); } @Override public void delete(int id) { Person person = getPersonById(id); if (person != null) { entityManager.getTransaction().begin(); entityManager.remove(person); entityManager.getTransaction().commit(); } } }
Run Application
JPATest.java
package _27.jpa.test; import java.sql.SQLException; import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import _27.jpa.model.Person; import _27.jpa.dao.PersonDAO; import _27.jpa.dao.PersonDAOImpl; public class JPATest { public static void main(String[] args) throws SQLException { ApplicationContext ctx = new ClassPathXmlApplicationContext("27.jpa.xml"); PersonDAO pService = ctx.getBean(PersonDAOImpl.class); // create person object Person person1 = new Person("oldName", "oldSurname", 1989); // insert pService.insert(person1); // find Person foundPerson = pService.getPersonById(1); System.out.println("Found ... " + foundPerson); // update person1.setName("Levent"); person1.setSurname("Erguder"); pService.update(person1); System.out.println("After Update..."); // find foundPerson = pService.getPersonById(1); System.out.println("Found ... " + foundPerson); Person person2 = new Person("James", "Gosling", 1955); Person person3 = new Person("Joshua", "Bloch", 1961); pService.insert(person2); pService.insert(person3); // delete pService.delete(1); // list List<Person> personList = pService.getAllPersons(); System.out.println("Listing..."); for (Person p : personList) { System.out.println(p); } ((ClassPathXmlApplicationContext) ctx).close(); } }
Ornegimizi calistirdigimizda ;
Found ... Person [id=1, name=oldName, surname=oldSurname, salary=1989] After Update... Found ... Person [id=1, name=Levent, surname=Erguder, salary=1989] Listing... Person [id=2, name=James, surname=Gosling, salary=1955]
Github kaynak dosyalar/ source folder
leventerguder/injavawetrust-spring-tutorial
Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer
Leave a Reply