Bazy danych tworzenie aplikacji bazodanowych ORM / JPA ORM (Object Relationa Mapping)/ORB (Object Relational Broker) to nazwa mechanizmu tłumaczenia obiektowej postaci danych wykorzystywanej w aplikacjach Java / C++ / C# / Python itp. W aplikacjach dostęp do danych odbywa się w sposób zgodny z paradygmatem podejścia obiektowego a ORM zapewnia, że fizycznie dane są przechowywane w relacyjnych bazach danych PostgreSQL, Oracle, MySQL itp. W języku Java mechanizm ORM realizowany jest przez standard JPA (Java Persistence API) implementowany najczęściej poprzez jedną z bibliotek Hibernate / EclipseLink (TopLink)/ OpenJPA. Mapowanie package pwrprogram.model; import java.io.serializable; import java.sql.date; import java.util.arraylist; import java.util.list; import javax.persistence.attributeoverride; import javax.persistence.attributeoverrides; import javax.persistence.column; import javax.persistence.embeddedid; import javax.persistence.entity; import javax.persistence.generatedvalue; import javax.persistence.generationtype; import javax.persistence.id; import javax.persistence.onetomany; import javax.persistence.table; @Entity @Table(name="Przedmioty") public class Przedmioty implements Serializable { /** * */ private static final long serialversionuid = 4742973919813402987L; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) Long id; String przedmiot; String modul; String symbol; Integer rok; Integer semestr; Integer zzu; Integer cnps; Integer ects; Integer ectsbk; String forma; Boolean tradycyjny;
String zaliczenie; Boolean ogolnouczelniany; String rodzaj; // Boolean typ; Boolean czy_wybor; Long id_grupa; String specjalnosc; String uwagi; String kierunek; String rokakademicki; private Boolean praktyczny; private Boolean stacjonarne; private Boolean usm; private String krk1; private String krk2; private Long godziny; 2. public Long getid() { return id; public void setid(long id) { this.id = id; public String getprzedmiot() { return przedmiot; public void setprzedmiot(string przedmiot) { this.przedmiot = przedmiot; public Integer getrok() { return rok; public void setrok(integer rok) { this.rok = rok; public Long getgodziny() { return godziny; public void setgodziny(long godziny) { this.godziny = godziny; Język HSQL Język pokrewny do SQL-a, w którym zamiast nazw tabel i ich pól używane są nazwy klas i ich pola, nie występuje inner join (dostęp do połączonych i zagnieżdżonych obiektów odbywa się po prostu poprzez operator kropki) za to są instrukcje fetch join (omówimy je przy strategiach ładowania danych do pamięci) Query q=em.createquery("select p from Parametry p where p.nazwaparametru =:p"); q.setparameter("p", ACTUAL_YEAR); Query q1=em.createquery("select p from Przedmioty p where p.rokakademicki=:rok and p.kierunek=:kierunek"); q1.setparameter("rok",ra); q1.setparameter("kierunek",kierunek);
3 Elementy architektury JPA Dołączone biblioteki JPA i odpowiedni JDBC
4 Persistence.xml Plik w katalogu Meta-inf definiujący połączenie z serwerem baz danych na którym fizycznie będą przechowywane dane <?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="pwr_program"> <provider>org.hibernate.jpa.hibernatepersistenceprovider</provider> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="eclipselink.ddl-generation.output-mode" value="database" /> <property name="hibernate.archive.autodetection" value="class" /> <property name="hibernate.dialect" value="org.hibernate.dialect.postgresqldialect" /> <property name="hibernate.connection.driver_class" value="org.postgresql.driver" /> <property name="hibernate.connection.url" value="jdbc:postgresql://127.0.0.1:5432/politechnika_programy" /> <property name="hibernate.connection.username" value="postgres" /> <property name="hibernate.connection.password" value="postgres" /> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.flushmode" value="flush_auto" /> <property name="hibernate.hbm2ddl.auto" value="update" /> </properties> </persistence-unit> </persistence>
5 Adnotacje @Entity - definicja klasy typu persistant, które ma swój odpowiednik w tabeli bazodanowej @Table nazwa tabeli odpowiadającej @NamedQuery definicja kwerendy w języku HSQL związanej z klasą encyjną (typu persistant) umieszczona w definicji tej klasy (większość środowisk programistycznych sprawdza poprawność takich kwerend w przeciwieństwie do tych umieszczonych bezpośrednio w kodzie) @Id, @GeneratedValue - informacje, że EntityManager em=persistence.createentitymanagerfactory("pwr_program").createentitymanager(); em.gettransaction().begin(); if(p.getid()!=null){ p=em.merge(p); else{ em.persist(p); em.gettransaction().commit(); return p;