„3. Perzisztencia (2012)” változatai közötti eltérés

Ferrero (vitalap | szerkesztései)
Nincs szerkesztési összefoglaló
Nagy Marcell (vitalap | szerkesztései)
a autoedit v2: fájlhivatkozások egységesítése, az új közvetlenül az adott fájlra mutat
 
(8 közbenső módosítás, amit 6 másik szerkesztő végzett, nincs mutatva)
1. sor: 1. sor:
__TOC__
{{RightTOC}}
==Szerializálás==
==Szerializálás==
===Serializable interfész===
===Serializable interfész===
10. sor: 10. sor:
* Leszármazottak szerializálás-lánca megszakítható a read/writeObject-ben NotSerializableException dobásával
* Leszármazottak szerializálás-lánca megszakítható a read/writeObject-ben NotSerializableException dobásával
===Kimentés===
===Kimentés===
<pre>
<syntaxhighlight lang="java">
class SerializableClass implements java.io.Serializable
class SerializableClass implements java.io.Serializable


22. sor: 22. sor:
...
...
}
}
</pre>  
</syntaxhighlight>  
===Visszaállítás===
===Visszaállítás===
<pre>
<syntaxhighlight lang="java">
try {
try {
FileInputStream f = new FileInputStream("filename");
FileInputStream f = new FileInputStream("filename");
33. sor: 33. sor:
catch(IOException ex) { ... }
catch(IOException ex) { ... }
catch(ClassNotFoundException ex) { ... }
catch(ClassNotFoundException ex) { ... }
</pre>  
</syntaxhighlight>  
===ObjectOutput interfész===
===ObjectOutput interfész===
* mindenre throws IOException
* mindenre throws IOException
52. sor: 52. sor:
* http://download.oracle.com/javase/1.4.2/docs/api/java/io/ObjectInput.html
* http://download.oracle.com/javase/1.4.2/docs/api/java/io/ObjectInput.html
===Externalizable interfész===
===Externalizable interfész===
* csak az osztály azonosítása mentődik automatikusan, a többi a mi kezünkben
* kiírás/beolvasás felüldefiniálása
* kiírás/beolvasás felüldefiniálása
* writeExternal(ObjectOutput out)
* writeExternal(ObjectOutput out)
* readExternal(ObjectInput in)
* readExternal(ObjectInput in)
[[Fájl:srl-osztalydiagram.png]]
[[File:srl-osztalydiagram.png]]


==Hibernate 3.0==
==Hibernate 3.0==
68. sor: 69. sor:
* &lt;property&gt; attribútum -&gt; oszlop
* &lt;property&gt; attribútum -&gt; oszlop
* &lt;many-to-one&gt;, &lt;one-to-one&gt;, reláció
* &lt;many-to-one&gt;, &lt;one-to-one&gt;, reláció
<pre>
<syntaxhighlight lang="xml">
<hibernate-mapping>
<hibernate-mapping>
<class name="auto.Person" table="PERSON">
<class name="auto.Person" table="PERSON">
88. sor: 89. sor:
</class>
</class>
</hibernate-mapping>
</hibernate-mapping>
</pre>  
</syntaxhighlight>  
===Kollekciók===
===Kollekciók===
* &lt;set&gt;, &lt;list&gt;, &lt;map&gt;, &lt;bag&gt;, &lt;array&gt;, &lt;&lt;p&gt;-array&gt;
* &lt;set&gt;, &lt;list&gt;, &lt;map&gt;, &lt;bag&gt;, &lt;array&gt;, &lt;&lt;p&gt;-array&gt;
* Javaban a megfelelő Collection interfészt kell használni, nem castolható
* Javaban a megfelelő Collection interfészt kell használni, nem castolható
<pre>
<syntaxhighlight lang="xml">
<class name="Product">
<class name="Product">
<id name="serialNumber" column="SN"/>
<id name="serialNumber" column="SN"/>
100. sor: 101. sor:
</set>
</set>
</class>
</class>
</pre>  
</syntaxhighlight>  
===Asszociáció===
===Asszociáció===
* kapcsolótáblát is kezel
* kapcsolótáblával (join table) vagy anélkül
* referencia más osztályokra
* referencia más osztályokra
* lásd reláció (1:1, 1:n, n:m)
* lásd reláció (1:1, 1:n, n:1, n:m)
===Öröklés===
===Öröklés===
* Támogatott:  
* Támogatott:  
** table-per-class-hierarchy (minden egy táblában, discriminator: típusjelölő)
** table-per-class-hierarchy (minden egy táblában, discriminator: típusjelölő)
<pre>
<syntaxhighlight lang="xml">
<class ...>
<class ...>
<discriminator column="PAYMENT_TYPEâ\x{fffd}\x{fffd} type="string"/>
<discriminator column="PAYMENT_TYPE" type="string"/>
<subclass name="CredCPay" discriminator-value="CREDIT">
<subclass name="CredCPay" discriminator-value="CREDIT">
  <property name="credCType" column="CCTYPE"/>
  <property name="credCType" column="CCTYPE"/>
116. sor: 117. sor:
</subclass>
</subclass>
</class>
</class>
</pre>  
</syntaxhighlight>  
** table-per-subclass
** table-per-subclass
<pre>
<syntaxhighlight lang="xml">
<class ...>
<class ...>
<joined-subclass name="CredCPayment" table="CREDIT_PAYMENT">
<joined-subclass name="CredCPayment" table="CREDIT_PAYMENT">
126. sor: 127. sor:
</joined-subclass>
</joined-subclass>
</class>
</class>
</pre>  
</syntaxhighlight>  
** table-per-concrete-class
** table-per-concrete-class
<pre>
<syntaxhighlight lang="xml">
<class ...>
<class ...>
<union-subclass name="CredCPayment" table="CREDIT_PAYMENT">
<union-subclass name="CredCPayment" table="CREDIT_PAYMENT">
135. sor: 136. sor:
</union-subclass>
</union-subclass>
</class>
</class>
</pre>
</syntaxhighlight>
 
===Objektumok kezelése===
===Objektumok kezelése===
* Állapotok:
* Állapotok (Session-höz képest):
** tranziens - még nem kapcsolódótt
** tranziens - még nem kapcsolódótt
** perzisztens - adatbázistáblával összekötve
** perzisztens - adatbázistáblával összekötve
** detached - már nem kapcsolódik
** lekapcsolt (detached) - már nem kapcsolódik
* Műveletek:
* Műveletek:
** session.flush() - módosítások mentése
** session.flush() - módosítások mentése
153. sor: 155. sor:
* Query q = session.createQuery(&hellip;);
* Query q = session.createQuery(&hellip;);
* visszatérés: skalár vagy tömb
* visszatérés: skalár vagy tömb
<pre>
<syntaxhighlight lang="java">
X x = (X)session.createQuery(..).uniqueResult();
X x = (X)session.createQuery(..).uniqueResult();
List l = session.createQuery(..).list();
List l = session.createQuery(..).list();
Iterator i = session.createQuery(..).iterate();
Iterator i = session.createQuery(..).iterate();
</pre>  
</syntaxhighlight>  
* paraméterek: név (:xname) vagy sorszám (? ? ?)
* paraméterek: név (:xname) vagy sorszám (? ? ?)
<pre>
<syntaxhighlight lang="java">
q.setString("x", "param");
q.setString("x", "param");
q.setString(1, "param1");
q.setString(1, "param1");
</pre>  
</syntaxhighlight>  
===HQL===
===HQL===
* From
* From
170. sor: 172. sor:
* Where
* Where
* Order by, Group by
* Order by, Group by
* Contrainteket is kezel
* Constrainteket is kezel


==JPA (Java Persistance API)==
==JPA (Java Persistance API)==
=== Alapok ===
=== Alapok ===
* az entitás szerializálható
* entitások: POJO (Plain olda java object) - szerializálhatónak kell lennie (más nem is kell)
* POJO (Plain olda java object) is szerializálható
* szabványos O-R kapcsolat
* szabványos O-R kapcsolat
* lekérdezhetöség
* lekérdezhetöség
185. sor: 186. sor:
=== Entitás ===
=== Entitás ===
* @Entity annotáció (vagy XML)
* @Entity annotáció (vagy XML)
* public vagy protected no-arg konstruktora van (final kizárva: osztály, metódus, változó)
* public vagy protected argumentum nélküli konstruktora van (final kizárva: osztály, metódus, változó)
* Serializable-t implementálja
* Serializable-t implementálja
* örökölhet entitástól vagy POJO-tól, POJO örökölhet entitástól
* ö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
* konténeren kívül is használhatóak
[[Fájl:oo_jpa_entitas.png]]
[[File:oo_jpa_entitas.png]]


==== Perzisztens elemek ====
==== Perzisztens elemek ====
209. sor: 210. sor:
* Entity Manager egyéb müveletei: find, getReference, flush, clear, Query
* Entity Manager egyéb müveletei: find, getReference, flush, clear, Query
* tranzitivitas: reláció paramétere, cascase = (müveletek) + ALL
* tranzitivitas: reláció paramétere, cascase = (müveletek) + ALL
<pre>
<syntaxhighlight lang="java">
@Entity
@Entity
public class MyClass implements Serializable {
public class MyClass implements Serializable {
222. sor: 223. sor:
       </attributes>
       </attributes>
</entity>
</entity>
</pre>
</syntaxhighlight>


=== Relációk ===
=== Relációk ===
* megegyezik a HIbernate-tel
* megegyezik a Hibernate-tel
* Annotációs: @OneToOne, @OneToMany, @ManyToOne, @ManyToMany
* 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 = )
* egy- és kétirányú, kétirányúnál tulajdonos oldal - idegen kulcs, inverz oldal - referencia (mappedBy = )
<pre>
<syntaxhighlight lang="java">
@Entity
@Entity
public class Car implements Serializable {
public class Car implements Serializable {
239. sor: 240. sor:
       @OneToMany(mappedBy = "owner")
       @OneToMany(mappedBy = "owner")
       private Collection<Car> cars = new HastSet();
       private Collection<Car> cars = new HastSet();
</pre>
</syntaxhighlight>


==== Öröklés ====
==== Öröklés ====
247. sor: 248. sor:
* JPQL (Java Persistence Query Language)
* JPQL (Java Persistence Query Language)
* Statikus lekérdezések: @NamedQuery, @NamedNativeQuery
* Statikus lekérdezések: @NamedQuery, @NamedNativeQuery
<pre>
<syntaxhighlight lang="java">
@Entity
@Entity
@NamedQuery(name = "carByplate", query = "SELECT c FROM Car c WHERE c.plate = :rsz")
@NamedQuery(name = "carByPlate", query = "SELECT c FROM Car c WHERE c.plate = :rsz")




Car c = (Car) em.createNamedQuery("carBypalte").setParameter("rsz", plate).getSingleResult();
Car c = (Car) em.createNamedQuery("carByPlate").setParameter("rsz", plate).getSingleResult();
</pre>
</syntaxhighlight>


* Dinamikus lekérdezések: runtime string komponálás, paraméterezéssel
* Dinamikus lekérdezések: runtime string komponálás, paraméterezéssel
<pre>
<syntaxhighlight lang="java">
Query query = em.createQuery("SELECT p FROM Product p WHERE p.param2 < :threshold ORDER BY p.param1 ascending");
Query query = em.createQuery("SELECT p FROM Product p WHERE p.param2 < :threshold ORDER BY p.param1 ascending");
query.setParamater("threshold", my_threshold);
query.setParamater("threshold", my_threshold);


List results = query.getResultList();
List results = query.getResultList();
</pre>
</syntaxhighlight>


* Natív SQL lekérdés a konkrét DB nyelve szerint, számozott paraméterezéssel
* Natív SQL lekérdés a konkrét DB nyelve szerint, számozott paraméterezéssel
<pre>
<syntaxhighlight lang="java">
Query query = em.createNativeQuery("SELECT * FROM Product p WHERE p.param2 < ?1");
Query query = em.createNativeQuery("SELECT * FROM Product p WHERE p.param2 < ?1");
query.setParameter(1, my_threshold).setMaxResults(10);
query.setParameter(1, my_threshold).setMaxResults(10);
List results = query.getResultList();
List results = query.getResultList();
</pre>
</syntaxhighlight>


* Criteria Query (Hibernate), Builder minta szerint futás közben
* Criteria Query (Hibernate), Builder minta szerint futás közben
<pre>
<syntaxhighlight lang="java">
CriteriaQuery cq1 = em.getCriteriaBuilder().createQuery();
CriteriaQuery cq1 = em.getCriteriaBuilder().createQuery();
cq1.select(cg1.from(Person.class));
cq1.select(cg1.from(Person.class));


Iterator iter = ((List<Person>) em.createQuery(cq1).getResultList()).iterator();
Iterator iter = ((List<Person>) em.createQuery(cq1).getResultList()).iterator();
</pre>
</syntaxhighlight>


==PSEPro (ObjectStore)==
==PSEPro (ObjectStore)==
283. sor: 284. sor:
* Állapotok:
* Állapotok:
** hollow (üres) - egy üres objektum, amibe az adatbázisból késleltetetten betölthetőek az adatok
** hollow (üres) - egy üres objektum, amibe az adatbázisból késleltetetten betölthetőek az adatok
** aktív - adatbázisban kapcsolatban áll
** aktív - adatbázisban kapcsolatban áll (clean/dirty)
** clean/dirty - memóriában módosított
** stale (lejárt) - adatbázishoz nem kapcsolt
** stale (lejárt) - adatbázishoz nem kapcsolt
===Szálak és Sessionök===
===Szálak és Sessionök===
* egyidőben egy adatbázishoz kapcsolódhat
* egyidőben egy adatbázishoz kapcsolódhat
292. sor: 293. sor:
* session public static Session create(String host, Properties props)
* session public static Session create(String host, Properties props)
* session létrehozása és törlése
* session létrehozása és törlése
<pre>
<syntaxhighlight lang="java">
public static Session create(String host, Properties props)
public static Session create(String host, Properties props)
public boolean isActive()
public boolean isActive()
public void terminate()
public void terminate()
</pre>
</syntaxhighlight>
* szálak kapcsolódása és lecsatolása
* szálak kapcsolódása és lecsatolása
<pre>
<syntaxhighlight lang="java">
public void join()
public void join()
public static void leave()
public static void leave()
</pre>
</syntaxhighlight>
===Adatbázisok===
===Adatbázisok===
* adatbázis létrehozás, megnyitás, bezárás
* adatbázis létrehozás, megnyitás, bezárás
<pre>
<syntaxhighlight lang="java">
public static Database create(String name, int fileMod)
public static Database create(String name, int fileMod)
public static Database open(String name, int openMode)
public static Database open(String name, int openMode)
public void close(boolean RetainAsTransient)
public void close(boolean RetainAsTransient)
</pre>
</syntaxhighlight>
===Tranzakciók===
===Tranzakciók===
* egyszerre egy sessionhöz kapcsolódhat
* egyszerre egy sessionhöz kapcsolódhat
* kiadhat read-lockot és update-lockot is
* kiadhat read-lockot és update-lockot is
<pre>
<syntaxhighlight lang="java">
public static Transaction begin(int type)
public static Transaction begin(int type)
public void commit(int retain)
public void commit(int retain)
public void abort(int retain)
public void abort(int retain)
</pre>
</syntaxhighlight>
[[Fájl:os-tranzakciok.png]]
[[File:os-tranzakciok.png]]


===Objektumok===
===Objektumok===
* perzisztenciához az objektumok root-tá tesszük
* perzisztenciához az objektumok root-tá tesszük
<pre>
<syntaxhighlight lang="java">
db.createRoot("foo", new Integer(5));
db.createRoot("foo", new Integer(5));
int x = (int)db.getRoot("foo");
int x = (int)db.getRoot("foo");
db.setRoot("foo", null);
db.setRoot("foo", null);
db.destroyRoot("foo");
db.destroyRoot("foo");
</pre>  
</syntaxhighlight>  
* minden kollekciónak megvan a maga OS... megfelelője
* minden kollekciónak megvan a maga OS... megfelelője
===Query===
===Query===
* paraméteres lekérdezés (fv opcionális)
* paraméteres lekérdezés (fv opcionális)
<pre>
<syntaxhighlight lang="java">
FreeVariables fv = new FreeVariables();
FreeVariables fv = new FreeVariables();
FreeVariableBindings fvb = new FreeVariableBindings();
fv.put("IS", Integer.TYPE);
fv.put("IS", Integer.TYPE);
fvb.put("IS", new Integer(20000));
Query q = new Query(Person.class, "getSalary()>=IS", fv);


Query q = new Query(Person.class, "getSalary()>=IS", fv);
Collection employees = (Collection)db.getRoot("employees");
Collection employees = (Collection)db.getRoot("employees");
Set result1 = q.select(employees); // több eredmény
FreeVariableBindings fvb = new FreeVariableBindings();
Object result2 = q.pick(employees); // egyetlen eredmény
fvb.put("IS", new Integer(20000));
Set result1 = q.select(employees, fvb); // több eredmény
Object result2 = q.pick(employees, fvb); // egyetlen eredmény
</syntaxhighlight>


</pre>
===Példa===
===Példa===
<pre>
<syntaxhighlight lang="java">
private String dbName = "cardb.odb";
private String dbName = "cardb.odb";
private Session session;
private Session session;
368. sor: 369. sor:
tr.commit(ObjectStore.RETAIN_HOLLOW);
tr.commit(ObjectStore.RETAIN_HOLLOW);
}
}
</pre>
</syntaxhighlight>


-- [[MeszegetoBalazsIstvan|MeszegetoBalazsIstvan]] - 2008.05.27.
-- [[MeszegetoBalazsIstvan|MeszegetoBalazsIstvan]] - 2008.05.27.
A lap eredeti címe: „https://vik.wiki/3._Perzisztencia_(2012)