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]

person table

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

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *