„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
|}


=== Hogyan támogatja a tranzakciókezelést a Spring? ===
*
...


== 8. ASP.NET Core ==
== 8. ASP.NET Core ==