„Háttéralkalmazások/Záróvizsgatételek” változatai közötti eltérés
→7. Spring: Tétel kidolgozása |
→7. Spring: Tétel kidolgozása |
||
| 71. sor: | 71. sor: | ||
!➖ | !➖ | ||
|- | |- | ||
|teljesítmény | |'''teljesítmény''' | ||
| | | | ||
* gyorsabb lokális feldolgozás | * gyorsabb lokális feldolgozás | ||
| 81. sor: | 81. sor: | ||
* nem lehet igazán jól skálázni | * nem lehet igazán jól skálázni | ||
|- | |- | ||
|szabvány | |'''szabvány''' | ||
| | | | ||
| | | | ||
| 90. sor: | 90. sor: | ||
* így nehezebben karbantartható a kód | * így nehezebben karbantartható a kód | ||
|- | |- | ||
|adatbiztonság | |'''adatbiztonság''' | ||
| | | | ||
* jobb megfelelés az ACID-elveknek | * jobb megfelelés az ACID-elveknek | ||
| 96. sor: | 96. sor: | ||
| | | | ||
|- | |- | ||
|az üzleti logika bárhonnan meghívhatja a szubrutinokat | |'''az üzleti logika bárhonnan meghívhatja a szubrutinokat''' | ||
| | | | ||
* növeli a kód újrafelhasználhatóságát | * növeli a kód újrafelhasználhatóságát | ||
| 121. sor: | 121. sor: | ||
!van mellékhatása? | !van mellékhatása? | ||
|- | |- | ||
|eljárás | |'''eljárás''' | ||
|🟠 lehet | |🟠 lehet | ||
|🟠 lehet | |🟠 lehet | ||
|- | |- | ||
|függvény | |'''függvény''' | ||
|🟢 igen, mindig | |🟢 igen, mindig | ||
|🔴 nem, soha | |🔴 nem, soha | ||
| 407. sor: | 407. sor: | ||
!előnyei | !előnyei | ||
|- | |- | ||
|automatikus | |'''automatikus''' | ||
|<syntaxhighlight lang="csharp" line="1">public class Book | |<syntaxhighlight lang="csharp" line="1">public class Book | ||
{ | { | ||
| 418. sor: | 418. sor: | ||
* a konvenciók alkalmazása kiváltja a további kód írását | * a konvenciók alkalmazása kiváltja a további kód írását | ||
|- | |- | ||
|annotációk | |'''annotációk''' | ||
|<syntaxhighlight lang="csharp" line="1"> | |<syntaxhighlight lang="csharp" line="1"> | ||
public class Book | public class Book | ||
| 434. sor: | 434. sor: | ||
* egyszerű, ismert szintaxis | * egyszerű, ismert szintaxis | ||
|- | |- | ||
|Fluent API | |'''Fluent API''' | ||
|<syntaxhighlight lang="csharp" line="1">protected override void OnModelCreating(ModelBuilder modelBuilder) | |<syntaxhighlight lang="csharp" line="1">protected override void OnModelCreating(ModelBuilder modelBuilder) | ||
{ | { | ||
| 455. sor: | 455. sor: | ||
!ki / mi készíti? | !ki / mi készíti? | ||
|- | |- | ||
|1. | |'''1.''' | ||
|OO-modell | |OO-modell | ||
| rowspan="2" |a fejlesztő C#-ban | | rowspan="2" |a fejlesztő C#-ban | ||
|- | |- | ||
|2. | |'''2.''' | ||
|ORM | |ORM | ||
|- | |- | ||
|3. | |'''3.''' | ||
|DB-objektumok | |DB-objektumok | ||
|EF Core Migration Tool | |EF Core Migration Tool | ||
| 473. sor: | 473. sor: | ||
!ki / mi készíti? | !ki / mi készíti? | ||
|- | |- | ||
|1. | |'''1.''' | ||
|DB-objektumok | |DB-objektumok | ||
|a fejlesztő SQL-ben | |a fejlesztő SQL-ben | ||
|- | |- | ||
|2. | |'''2.''' | ||
|ORM | |ORM | ||
| rowspan="2" |EF Core Reverse Engineering Tool | | rowspan="2" |EF Core Reverse Engineering Tool | ||
|- | |- | ||
|3. | |'''3.''' | ||
|OO-modell | |OO-modell | ||
|} | |} | ||
| 494. sor: | 494. sor: | ||
!N:N | !N:N | ||
|- | |- | ||
|annotációkkal | |'''annotációkkal''' | ||
|Entitások:<syntaxhighlight lang="csharp" line="1">public class Blog | |Entitások:<syntaxhighlight lang="csharp" line="1">public class Blog | ||
{ | { | ||
| 547. sor: | 547. sor: | ||
}</syntaxhighlight> | }</syntaxhighlight> | ||
|- | |- | ||
|Fluent API-val | |'''Fluent API-val''' | ||
|Entitások:<syntaxhighlight lang="csharp" line="1">public class Blog | |Entitások:<syntaxhighlight lang="csharp" line="1">public class Blog | ||
{ | { | ||
| 643. sor: | 643. sor: | ||
!<code>dbContext</code>-függvényhívás | !<code>dbContext</code>-függvényhívás | ||
|- | |- | ||
|create | |'''create''' | ||
|<code>.Dogs.Add(newDog);</code> | |<code>.Dogs.Add(newDog);</code> | ||
|- | |- | ||
|read | |'''read''' | ||
|ld. az előző táblázatot | |ld. az előző táblázatot | ||
|- | |- | ||
|update | |'''update''' | ||
|<code>.Dogs.Find(dogId);</code> | |<code>.Dogs.Find(dogId);</code> | ||
<code>dog.BirthDate = birthDate;</code> | <code>dog.BirthDate = birthDate;</code> | ||
|- | |- | ||
|delete | |'''delete''' | ||
|adatbetöltéssel: | |adatbetöltéssel: | ||
<code>.Dogs.Find(dogId);</code> | <code>.Dogs.Find(dogId);</code> | ||
| 742. sor: | 742. sor: | ||
!létezik | !létezik | ||
|- | |- | ||
| rowspan="2" |a memóriában (perzisztenciakontextusban) | | rowspan="2" |'''a memóriában (perzisztenciakontextusban)''' | ||
|nem létezik | |'''nem létezik''' | ||
|– | |– | ||
|''detached'' | |''detached'' | ||
|- | |- | ||
|létezik | |'''létezik''' | ||
|''new'' | |''new'' | ||
|''managed'' vagy ''removed'' | |''managed'' vagy ''removed'' | ||
| 793. sor: | 793. sor: | ||
!példa | !példa | ||
|- | |- | ||
|egyszerű | |'''egyszerű''' | ||
|elsődleges kulcs alapján | |'''elsődleges kulcs alapján''' | ||
|<syntaxhighlight lang="java" line="1">Person p = entityManager.find(Person.class, 42L);</syntaxhighlight> | |<syntaxhighlight lang="java" line="1">Person p = entityManager.find(Person.class, 42L);</syntaxhighlight> | ||
|- | |- | ||
| rowspan="2" |feltételekkel | | rowspan="2" |'''feltételekkel''' | ||
|Criteria API | |'''Criteria API''' | ||
|<syntaxhighlight lang="java" line="1">CriteriaBuilder cb = entityManager.getCriteriaBuilder(); | |<syntaxhighlight lang="java" line="1">CriteriaBuilder cb = entityManager.getCriteriaBuilder(); | ||
CriteriaQuery<Person> cq = cb.createQuery(Person.class); | CriteriaQuery<Person> cq = cb.createQuery(Person.class); | ||
| 808. sor: | 808. sor: | ||
Person p = entityManager.createQuery(cq).getSingleResult();</syntaxhighlight> | Person p = entityManager.createQuery(cq).getSingleResult();</syntaxhighlight> | ||
|- | |- | ||
|Query by Example<ref>Nem tananyag, de Tanár Úr jelezte, hogy a Java 2. házit ennek segítségével lehet megoldani legszebben.</ref> | |'''Query by Example<ref>Nem tananyag, de Tanár Úr jelezte, hogy a Java 2. házit ennek segítségével lehet megoldani legszebben.</ref>''' | ||
|<syntaxhighlight lang="java" line="1">Person probe = new Person(); | |<syntaxhighlight lang="java" line="1">Person probe = new Person(); | ||
ExampleMatcher matcher = ExampleMatcher | ExampleMatcher matcher = ExampleMatcher | ||
| 819. sor: | 819. sor: | ||
List<Person> results = repo.findAll(example);</syntaxhighlight> | List<Person> results = repo.findAll(example);</syntaxhighlight> | ||
|- | |- | ||
| rowspan="2" |nyersen | | rowspan="2" |'''nyersen''' | ||
''(el is lehet nevezni őket)'' | '''''(el is lehet nevezni őket)''''' | ||
|JPQL | |'''JPQL''' | ||
|<syntaxhighlight lang="java" line="1">TypedQuery<Person> q = entityManager.createQuery( | |<syntaxhighlight lang="java" line="1">TypedQuery<Person> q = entityManager.createQuery( | ||
"SELECT p FROM Person p WHERE p.age > :age", Person.class | "SELECT p FROM Person p WHERE p.age > :age", Person.class | ||
| 829. sor: | 829. sor: | ||
List<Person> list = q.getResultList();</syntaxhighlight> | List<Person> list = q.getResultList();</syntaxhighlight> | ||
|- | |- | ||
|SQL | |'''SQL''' | ||
|<syntaxhighlight lang="java" line="1">List<Object[]> rows = entityManager.createNativeQuery( | |<syntaxhighlight lang="java" line="1">List<Object[]> rows = entityManager.createNativeQuery( | ||
"SELECT first_name, last_name FROM person WHERE age > :min" | "SELECT first_name, last_name FROM person WHERE age > :min" | ||
| 848. sor: | 848. sor: | ||
!miben segít? | !miben segít? | ||
|- | |- | ||
|repositoryk | |'''repositoryk''' | ||
használata | '''használata''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
interface BusRepository extends JpaRepository<Bus, Long> { } | interface BusRepository extends JpaRepository<Bus, Long> { } | ||
| 857. sor: | 857. sor: | ||
* kevesebb boilerplate kód | * kevesebb boilerplate kód | ||
|- | |- | ||
|konvenciók | |'''konvenciók''' | ||
használata | '''használata''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
List<Bus> findByLpn(String lpn); | List<Bus> findByLpn(String lpn); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|rendezés | |'''rendezés''' | ||
és lapozás | '''és lapozás | ||
támogatása | támogatása''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
interface BusRepository extends PagingAndSortingRepository<Bus, Long> { | interface BusRepository extends PagingAndSortingRepository<Bus, Long> { | ||
| 875. sor: | 875. sor: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|egyedi | |'''egyedi''' | ||
lekérdezés | '''lekérdezés''' | ||
|<syntaxhighlight lang="java" line="1">@Query("SELECT DISTINCT b FROM Bus b WHERE b.lpn LIKE :lpn")</syntaxhighlight> | |<syntaxhighlight lang="java" line="1">@Query("SELECT DISTINCT b FROM Bus b WHERE b.lpn LIKE :lpn")</syntaxhighlight> | ||
| | | | ||
| 893. sor: | 893. sor: | ||
!kétirányú | !kétirányú | ||
|- | |- | ||
|<code>@OneToOne</code> | |<code>'''@OneToOne'''</code> | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Entity | @Entity | ||
| 923. sor: | 923. sor: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|<code>@OneToMany</code> | |<code>'''@OneToMany'''</code> | ||
és | '''és | ||
<code>@ManyToOne</code> | <code>@ManyToOne</code>''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Entity | @Entity | ||
| 957. sor: | 957. sor: | ||
}</syntaxhighlight> | }</syntaxhighlight> | ||
|- | |- | ||
|<code>@ManyToMany</code> | |<code>'''@ManyToMany'''</code> | ||
|<syntaxhighlight lang="java" line="1">@Entity | |<syntaxhighlight lang="java" line="1">@Entity | ||
class A { | class A { | ||
| 1 008. sor: | 1 008. sor: | ||
!<code>@Inheritance(strategy = …)</code> | !<code>@Inheritance(strategy = …)</code> | ||
|- | |- | ||
|[[Háttéralkalmazások/Záróvizsgatételek#Egy táblába, gányul|egy táblába, gányul]] | |[[Háttéralkalmazások/Záróvizsgatételek#Egy táblába, gányul|'''egy táblába, gányul''']] | ||
|<code>SINGLE_TABLE</code> | |<code>SINGLE_TABLE</code> | ||
|- | |- | ||
|[[Háttéralkalmazások/Záróvizsgatételek#Külön táblába a valós osztályokat|külön táblába a valós osztályokat]] | |[[Háttéralkalmazások/Záróvizsgatételek#Külön táblába a valós osztályokat|'''külön táblába a valós osztályokat''']] | ||
|<code>TABLE_PER_CLASS</code> | |<code>TABLE_PER_CLASS</code> | ||
|- | |- | ||
|[[Háttéralkalmazások/Záróvizsgatételek#Külön táblába az összes osztályt|külön táblába az összes osztályt]] | |[[Háttéralkalmazások/Záróvizsgatételek#Külön táblába az összes osztályt|'''külön táblába az összes osztályt''']] | ||
|<code>JOINED</code> | |<code>JOINED</code> | ||
|- | |- | ||
|[[Háttéralkalmazások/Záróvizsgatételek#Absztrakt struktúrába|absztrakt struktúrába]] | |[[Háttéralkalmazások/Záróvizsgatételek#Absztrakt struktúrába|'''absztrakt struktúrába''']] | ||
|– | |– | ||
|} | |} | ||
| 1 040. sor: | 1 040. sor: | ||
A következő annotációkkal: | A következő annotációkkal: | ||
{| class="wikitable mw-collapsible mw-collapsed" | {| class="wikitable mw-collapsible mw-collapsed" | ||
|+Opciók a legrosszabbtól a legjobbig | |+Opciók (a legrosszabbtól a legjobbig) | ||
!lehet injektálni | !lehet injektálni | ||
!példa | !példa | ||
|- | |- | ||
|mezőbe | |'''mezőbe''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Service | @Service | ||
| 1 059. sor: | 1 059. sor: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|setterbe | |'''setterbe''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Service | @Service | ||
| 1 077. sor: | 1 077. sor: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|konstruktorba | |'''konstruktorba''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Service | @Service | ||
| 1 099. sor: | 1 099. sor: | ||
=== Milyen élettartama lehet egy springes beannek? === | === Milyen élettartama lehet egy springes beannek? === | ||
{| class="wikitable" | {| class="wikitable" | ||
|+Scope-ok a leghosszabbtól a legrövidebb életűig | |+Scope-ok (a leghosszabbtól a legrövidebb életűig) | ||
!típus | !típus | ||
!annotáció | !annotáció | ||
!minek az életciklusához van kötve | !minek az életciklusához van kötve | ||
|- | |- | ||
|singleton | |'''singleton''' | ||
|''– (ez az alapértelmezett)'' | |''– (ez az alapértelmezett)'' | ||
|semminek, csak egy van belőle az egész alkalmazásban | |semminek, csak egy van belőle az egész alkalmazásban | ||
|- | |- | ||
|application | |'''application''' | ||
|<code>@Scope("application")</code> | |<code>@Scope("application")</code> | ||
|<code>ServletContext</code><ref>Webalkalmazásoknál használatos.</ref> | |<code>ServletContext</code><ref>Webalkalmazásoknál használatos.</ref> | ||
|- | |- | ||
|prototype | |'''prototype''' | ||
|<code>@Scope("prototype")</code> | |<code>@Scope("prototype")</code> | ||
|új példány jön létre minden <code>getBean()</code> (<code>@Autowired</code>) hívásra | |új példány jön létre minden <code>getBean()</code> (<code>@Autowired</code>) hívásra | ||
|- | |- | ||
|websocket | |'''websocket''' | ||
|<code>@Scope(scopeName="websocket", proxyMode=...)</code> | |<code>@Scope(scopeName="websocket", proxyMode=...)</code> | ||
|<code>WebSocket</code> session | |<code>WebSocket</code> session | ||
|- | |- | ||
|session | |'''session''' | ||
|<code>@Scope("session")</code> | |<code>@Scope("session")</code> | ||
|HTTP session | |HTTP session | ||
|- | |- | ||
|request | |'''request''' | ||
|<code>@Scope("request")</code> | |<code>@Scope("request")</code> | ||
|HTTP-kérés | |HTTP-kérés | ||
|} | |} | ||
=== Hogyan könnyíti meg a JPA használatát a Spring Data JPA? === | === [[Háttéralkalmazások/Záróvizsgatételek#Hogyan bővíti a lehetőségeket a Spring Data JPA a lekérdezések megfogalmazásának területén?|Hogyan könnyíti meg a JPA használatát a Spring Data JPA?]] === | ||
... | === Hogyan támogatja a tranzakciókezelést a Spring? === | ||
Egységes API-ja van, ami mögé ezeket a tranzakciókezelőket lehet berakni: | |||
{| class="wikitable" | |||
|+Tranzakciókezelők (az alacsonyabb szinttől a magasabbig) | |||
!típus | |||
!jellemzői | |||
|- | |||
|'''JDBC''' | |||
|– | |||
|- | |||
|'''EntityTransaction (JPA)''' | |||
|ld.: ''[[Háttéralkalmazások/Záróvizsgatételek#Ismertesd a Java Persistence API architektúráját és főbb jellemzőit!|Ismertesd a Java Persistence API architektúráját és főbb jellemzőit!]]'' | |||
|- | |||
|'''JDO (Java Data Objects)''' | |||
|a ''JTA'' elődje | |||
|- | |||
|'''JTA (Jakarta Transactions)''' | |||
|szolgáltatásokon átívelő tranzakciókat lehet végrehajtani | |||
|} | |||
{| class="wikitable" | |||
|+Tranzakciókezelés módjai (a kevésbé népszerűtől a népszerűbbig) | |||
!típus | |||
!hogyan indítjuk / | |||
zárjuk le a tranzakciókat? | |||
!példa | |||
|- | |||
|'''programozott''' | |||
|a kódban | |||
|<syntaxhighlight lang="java" line="1"> | |||
@Service | |||
public class OrderService { | |||
private final PlatformTransactionManager transactionManager; | |||
public OrderService(PlatformTransactionManager transactionManager) { | |||
this.transactionManager = transactionManager; | |||
} | |||
public void processOrder() { | |||
TransactionStatus transactionStatus = transactionManager | |||
.getTransaction(new DefaultTransactionDefinition()); | |||
try { | |||
validateOrder(); | |||
chargeCustomer(); | |||
saveOrderToDatabase(); | |||
transactionManager.commit(transactionStatus); | |||
System.out.println("Transaction committed successfully!"); | |||
} catch (RuntimeException ex) { | |||
transactionManager.rollback(transactionStatus); | |||
System.out.println( | |||
"Transaction was rolled back due to the following error: " + ex.getMessage() | |||
); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
|- | |||
|'''deklaratív''' | |||
|metódusannotációkkal | |||
|<syntaxhighlight lang="java" line="1"> | |||
@Service | |||
public class OrderService { | |||
@Transactional | |||
public void processOrder() { | |||
validateOrder(); | |||
chargeCustomer(); | |||
saveOrderToDatabase(); | |||
// kezeletlen kivétel esetén a Spring automatikusan rollbackel | |||
} | |||
} | |||
</syntaxhighlight> | |||
|} | |||
{| class="wikitable" | |||
|+A <code>@Transactional</code> paraméterei | |||
!paraméter | |||
!értéke | |||
|- | |||
|<code>(no)rollbackFor(ClassName)</code> | |||
|milyen kivételek esetén legyen rollback | |||
|- | |||
|<code>timeout</code> | |||
|az időkorlát másodpercben | |||
|- | |||
|<code>isolation</code> | |||
|izolációs szint (a JPA nem támogatja) | |||
|- | |||
|<code>value</code> | |||
|a tranzakciókezelő azonosítója (több adatbázis esetén fontos) | |||
|- | |||
|<code>propagation</code> | |||
|kompatibilitás egy tranzakcionális metódusból hívott másik tranzakcionális metódussal | |||
|} | |||
{| class="wikitable" | |||
|+A <code>propagation</code> értékei (a megengedőbbtől a szigorúbbig) | |||
! rowspan="2" |érték | |||
! colspan="2" |mit tesz a jelenlegi függvény... | |||
! colspan="2" |mi történik a következő függvénnyel? | |||
|- | |||
!...ha van aktív tranzakció? | |||
!...ha nincs aktív tranzakció? | |||
!...ha van aktív tranzakció? | |||
!...ha nincs aktív tranzakció? | |||
|- | |||
|'''<code>REQUIRED</code>''' | |||
(alapértelmezett) | |||
|azt folytatja | |||
|újat hoz létre | |||
|a jelenlegit folytatja | |||
|– | |||
|- | |||
|'''<code>NESTED</code>''' | |||
|folytatódik, és egy <code>SAVEPOINT</code>-ot hoz létre | |||
|újat hoz létre | |||
|a jelenlegit folytatja – rollback esetén csak a <code>SAVEPOINT</code>-ig áll vissza | |||
|– | |||
|- | |||
|'''<code>REQUIRES_NEW</code>''' | |||
|felfüggeszti | |||
|újat hoz létre | |||
|új tranzakciót használ | |||
|– | |||
|- | |||
|'''<code>SUPPORTS</code>''' | |||
|azt folytatja | |||
|tranzakció nélkül fut | |||
|azt folytatja | |||
|tranzakció nélkül fut | |||
|- | |||
|'''<code>MANDATORY</code>''' | |||
|azt folytatja | |||
|kivételt dob | |||
|azt folytatja | |||
|– | |||
|- | |||
|'''<code>NOT_SUPPORTED</code>''' | |||
|felfüggeszti | |||
|– | |||
|– | |||
|tranzakció nélkül fut | |||
|- | |||
|'''<code>NEVER</code>''' | |||
|kivételt dob | |||
|tranzakció nélkül fut | |||
|– | |||
|tranzakció nélkül fut | |||
|} | |||
* | |||
== 8. ASP.NET Core == | == 8. ASP.NET Core == | ||