„3. Perzisztencia (2012)” változatai közötti eltérés
Nincs szerkesztési összefoglaló |
|||
| 171. sor: | 171. sor: | ||
* Order by, Group by | * Order by, Group by | ||
* Contrainteket is kezel | * Contrainteket is kezel | ||
==JPA (Java Persistance API)== | |||
=== Alapok === | |||
* az entitás szerializálható | |||
* POJO (Plain olda java object) is szerializálható | |||
* szabványos O-R kapcsolat | |||
* lekérdezhetöség | |||
* Entity Manager (EM) a felügyelö | |||
** Persistence context (PC): perzisztens objektumok futási környezete, élettartamár a konténer vagy az alkalmazás menedzseli | |||
* Session (hibernate) == EM (JPA) ?? | |||
* Persistence Unit: standard könyvtárszerkezet, O-R leképezéseket, relációkat, ezek hatásközét tartalmazza, illetve Java annotációkat és/vagy XML-t (persistence.xml) | |||
=== Entitás === | |||
* @Entity annotáció (vagy XML) | |||
* public vagy protected no-arg konstruktora van (final kizárva: osztály, metódus, változó) | |||
* Serializable-t implementálja | |||
* örökölhet entitástól vagy POJO-tól, POJO örökölhet entitástól | |||
* konténeren kívül is használhatóak | |||
[[Fájl:oo_jpa_entitas.png]] | |||
==== Perzisztens elemek ==== | |||
* mezötöl és propertytöl is függ hogy perzisztens-e | |||
* nem szerializálható elemek: static, transient, @Transient | |||
* szerializálhatóak: mezök és propertyk (@Basic): primitiv, string, wrapper, byte[], char[], enum, Collection, Set, List, Map (generic is), összetett, beágyazott (@Embedded) | |||
* betöltés lehet: Eager és Lazy | |||
==== Kulcs ==== | |||
* Primary key kötelezö | |||
* egyszerü kulcs: @Id, ami lehet primitiv, wrapper, string, date | |||
* összetett kulcs | |||
** Primary Key osztály: @IdClass | |||
** Kulcs elem: @EmbeddedId | |||
* kulcsgenerálás: @GeneratedValue(strategy = GenerationType.X), ahol X = AUTO, SEQUENCE, IDENTITY, TABLE | |||
==== Entitások életciklusa ==== | |||
* Entity Manager müveletei: persist, refresh, remove, merge | |||
* Entity Manager egyéb müveletei: find, getReference, flush, clear, Query | |||
* tranzitivitas: reláció paramétere, cascase = (müveletek) + ALL | |||
<pre> | |||
@Entity | |||
public class MyClass implements Serializable { | |||
@Basic | |||
Date birthday; | |||
} | |||
<entity name="mydonain.MyClass"> | |||
<attributes> | |||
<basic name="birthday"/> | |||
</attributes> | |||
</entity> | |||
</pre> | |||
=== Relációk === | |||
* megegyezik a HIbernate-tel | |||
* Annotációs: @OneToOne, @OneToMany, @ManyToOne, @ManyToMany | |||
* egy- és kétirányú, kétirányúnál tulajdonos oldal - idegen kulcs, inverz oldal - referencia (mappedBy = ) | |||
<pre> | |||
@Entity | |||
public class Car implements Serializable { | |||
@ManyToOne | |||
private Person owner; | |||
@Entity | |||
public class Person implements Serializable { | |||
@OneToMany(mappedBy = "owner") | |||
private Collection<Car> cars = new HastSet(); | |||
</pre> | |||
==== Öröklés ==== | |||
* table-per-class-hierarchy, table-per-subclass, table-per-concrete-class | |||
=== Lekérdezések === | |||
* JPQL (Java Persistence Query Language) | |||
* Statikus lekérdezések: @NamedQuery, @NamedNativeQuery | |||
<pre> | |||
@Entity | |||
@NamedQuery(name = "carByplate", query = "SELECT c FROM Car c WHERE c.plate = :rsz") | |||
Car c = (Car) em.createNamedQuery("carBypalte").setParameter("rsz", plate).getSingleResult(); | |||
</pre> | |||
* Dinamikus lekérdezések: runtime string komponálás, paraméterezéssel | |||
<pre> | |||
Query query = em.createQuery("SELECT p FROM Product p WHERE p.param2 < :threshold ORDER BY p.param1 ascending"); | |||
query.setParamater("threshold", my_threshold); | |||
List results = query.getResultList(); | |||
</pre> | |||
* Natív SQL lekérdés a konkrét DB nyelve szerint, számozott paraméterezéssel | |||
<pre> | |||
Query query = em.createNativeQuery("SELECT * FROM Product p WHERE p.param2 < ?1"); | |||
query.setParameter(1, my_threshold).setMaxResults(10); | |||
List results = query.getResultList(); | |||
</pre> | |||
* Criteria Query (Hibernate), Builder minta szerint futás közben | |||
<pre> | |||
CriteriaQuery cq1 = em.getCriteriaBuilder().createQuery(); | |||
cq1.select(cg1.from(Person.class)); | |||
Iterator iter = ((List<Person>) em.createQuery(cq1).getResultList()).iterator(); | |||
</pre> | |||
==PSEPro (ObjectStore)== | ==PSEPro (ObjectStore)== | ||
* OO adatbázis, 50 MB adatkezelés, egy-felhasználós, konkurens session-ök, alkalmazáson belül fut, nincs külsö adatbázis, szemétgyüjtés megoldva | |||
===Objektumok tulajdonságai=== | ===Objektumok tulajdonságai=== | ||
* Állapotok: | * Állapotok: | ||