Systemy informatyczne - wiwcom.pl

  • 07 luty 2012, wtorek
  • Załóż swoje konto!
    *
    *
    *
    *
    *
    Fields marked with an asterisk (*) are required.
Jesteś tu: Home J2EE JPA w Netbeans

JPA w Netbeans

Email Drukuj PDF
Autor: Zacheusz Siedlecki (http://java.zacheusz.eu/jpa-w-netbeans-tutorial/5/)

Java Persistence API (JPA) jako część technologii EJB 3.0 upraszcza zapis danych obiektowych w relacyjnym modelu danych. Trwały zapis modelu aplikacji jest łatwiejszy niż przy pomocy entity beans w EJB 2.1. Używanie entity beans nie było zbyt wygodne i programiści bardzo często w zamian stosowali frameworki takie jak Hibernate, Oracle TopLink, i Java Data Objects (JDO). JPA bazuje na pomysłach grup pracujących nad tymi frameworkami.

 

Ten post umieściłem w kategorii Java EE. JPA jest częścią specyfikacji Enterprise JavaBeans 3.0 ale nie znaczy to, że nie można go użyć w zwykłej aplikacji SE. Opiszę tutaj właśnie taki przykład. Użyję do tego NetBeans IDE 6 wraz z biblioteką TopLink Essentials, która jest implementacją JPA wykonaną przez Oracle.

Opis czynności jest zwięzły bez zbytniego rozwodzenia się. Bystry programista po tworzonym kodzie pozna co się dzieje.

  • tworzę nowy projekt Java SE
  • upewniam się, że ma ustawioną składnię 1.5 i JDK conajmniej 1.5
  • dodaję do bibliotek projektu sterownik JDBC
  • dodaję do bibliotek projektu TopLink Essentials
  • z popup menu na projekcie New->File/Folder->Persistence->Entity Class
  • nazwa klasy Student, pakiet entity
  • klikam “Create Persistence Unit” i konfiguruję połączenie z bazą (użytkownik musi mieć prawo CREATE)
  • klikam Create i Finish
  • przy pomocy adnotacji @Table zmieniam nazwę tabeli odpowiadającej tej klasie w bazie danych
@Entity
@Table(name="STUDENCI") //domyślnie "Student"
public class Student implements Serializable {
  • w klasie Student dodaję trzy pola i tworzę dla nich akcesory
private String name;
private String surname;
private SGroup group; // jeszcze nie utworzyłem takiej klasy
  • przy pomocy adnotacji @Column zmieniam nazwy kolumn odpowiadających polom w bazie (domyślnie miałyby takie nazwy jak pola)
@Column(name = "numer_indeksu")
@Id
private Long id;
@Column(name="imie")
private String name;
@Column(name="nazwisko")
private String surname;
@JoinColumn(name="grupa_dziekanska")
private SGroup group;
  • przy pomocy adnotacji ustalam, że group będzie się odnosić do relacji wiele do jednego
@JoinColumn(name="grupa_dziekanska")
@ManyToOne
private SGroup group;
  • tworzę akcesory dla pól: zaznaczam je i z menu Refractor->Encapsulate Fields
  • analogicznie do klasy Student tworzę nowy plik dla klasy SGroup
  • przy pomocy adnotacji @Table ustalam nazwę tabeli w bazie danych
@Entity
@Table(name="GRUPY_DZIEKANSKIE")
public class SGroup implements Serializable {
  • tworzę klasę TryInsert z metodą public static void main(String[] a)
  • w kodzie klasy z menu podręcznego Persistence->Use Entity Manager
  • automatycznie utworzy się metoda public void persist(Object object) służąca do zapisu do bazy, której kod warto prześledzić
  • w metodzie main umieszczam przykładowy kod tworzący grupę dziekańską i dodający studenta:
SGroup group = new SGroup();
group.setName("BDISK1");
tryInsert.persist (group);
Student student = new Student();
student.setId(1L);
student.setName("Jurek");
student.setSurname("Gryzipiórek");
student.setGroup(group);
tryInsert.persist(student);
  • oglądam zawartość bazy i cieszę się automatycznie utworzonymi tabelami i danymi.
  • tworzę klasę TrySelect z metodą main
  • dodaję kod wyszukujący pojedyńczego studenta po Id:
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("TryJPA1PU");
EntityManager em = emf.createEntityManager();
Long numerIndexu = 1L;
Student student = em.find(Student.class, numerIndexu);
em.close();
System.out.println("Imię:" + student.getName());
System.out.println("Nazwisko:" + student.getSurname());
  • uruchamiam i cieszę się z tego jak działa automat ;)
  • tworzę klasę TryUpdate z metodą main
  • wpisuję kod wybierający studenta o podanym numerze indeksu i zmieniający jego imię w jednej transakcji:
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("TryJPA1PU");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
try {
Long numerIndexu = 1L;
Student student = em.find(Student.class, numerIndexu);
student.setName("Jerzy");
em.persist(student);
em.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
em.getTransaction().rollback();
} finally {
em.close();
}
  • oglądam dane w bazie
  • teraz pokażę pobieranie listy obiektów w bazie - aby było to spójne wprowadzę te obiekty w tym samym przykładzie.
  • tworzę klasę TrySelectList z metodą main
  • w metodzie main tworzę grupę i dwóch studentów:
SGroup g = new SGroup ();
g.setName("Grupa Ani");
Student s1 = new Student();
s1.setId(7L);
s1.setName("Ania");
s1.setSurname("Kowalska");
s1.setGroup(g);
Student s2 = new Student ();
s2.setId(8L);
s2.setName("Ania");
s2.setSurname("Nowak");
s2.setGroup(g);
  • zapisuję dane w jednej transakcji do bazy:
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("TryJPA1PU");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
try {
em.persist(g);
em.persist(s1);
em.persist(s2);
em.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
em.getTransaction().rollback();
}
  • Przed klasą Student dodaję Named Query (do wyszukiwania studentów po imieniu):
@Entity
@Table (name="STUDENCI")
@NamedQueries({
@NamedQuery(
name="studentsForName",
query="SELECT s FROM Student s WHERE s.name = :studentName"
)
})
public class Student implements Serializable {
  • a w metodzie main klasy TrySelectList:
Query query = em.createNamedQuery( "studentsForName");
query.setParameter("studentName", "Ania");
List <Student> students = query.getResultList();
for (Student s : students) {
System.out.println (s.getId() + " " + s.getSurname());
}
em.close();
  • uruchamiam klasę TrySelectList i cieszę się z wyniku

W powyższym opisie poruszyłem jedynie podstawowe zagadnienia związane z JPA. Na szczególną uwagę zasługuje język zapytań JPA-QL będący potężnym narzędziem. Mimo wszystko myślę, że po przeanalizowaniu niniejszego opisu można już pisać proste aplikacje z użyciem JPA.