---
# System prepended metadata

title: PSK 2-o laboro know-how

---

# PSK 2-o laboro know-how

Jei kas netingit, tai parasykit step-by-step kaip kiekviena reikalavima sukodint, su paaiskinimais, issaugosit visiem laiko. Galesiu nupirkt banana po karantino. - TZ

## 1. Optimistinis rakinimas
Kai kodinsit, ir niekaip nemes exceptiono, būtinai susikurkit naują komponentą update'inimui. Kažkas kaip `updateDoctorDetails`:
```xml
<h:inputText a:placeholder="new name" value="#{updateDoctorDetails.doctor.name}" required="true"/>
    <h:commandButton value = "Update" action="#{updateDoctorDetails.updateDoctorName()}">
        <f:param name="doctorId" value="#{doctorDetails.doctor.id}"/>
    </h:commandButton>
<h:outputText value="Value was already modified by other user. If you want to override it - try again" rendered="#{param['error'] == 'optimistic-lock-exception'}" />
```
#### 1.1 Kas nutinka su einamąja transakcija, kai gaunamas OptimisticLockException?
The current transaction, if one is active, will be marked for rollback.
#### 1.2 Kas nutinka su einamuoju EntityManager, kai gaunamas OptimisticLockException? Kaip išsaugoti esybę į DB po OptimisticLockException?
* Transaction rollback causes all pre-existing managed instances to become detached (nežinau ar teisingai supratau, bet gal čia reikia paminėt tai, kad to entity manager'io entičiai nebėra persist'inami?)
* Execption handling code must initiate new transaction: `@Transactional(REQUIRES_NEW)`

## 2. Asinchroninis komunikavimas
Su jsf (dėstytojo pvz) nepasidaro normaliai, reikia parefreshint page'ą kad išsitraukt rezultatą.

#### 2.1 Ar gali asinchroninis komponentas įsijungti į kvietėjo pradėtą transakciją?
https://stackoverflow.com/questions/4016117/default-ejb-transaction-mode-for-asynchronous-methods

Asynchronous method should be annotated with `@Transactional(REQUIRES_NEW)`

#### 2.2 Ar gali asinchroninis komponentas naudoti @RequestScoped EntityManager?
If EntityManager is used it can not be RequestScoped (paskutinė skaidrė 13-os paskaitos)

## 3. Glass-box extensibility: pateikti po vieną pavyzdį:
#### 3.1 CDI alternatives (@Alternative), alternatyvos pasirinkimas beans.xml faile (0.1)
1. beans.xml pakeiskit `bean-discovery-mode="annotated"` -> `bean-dicsovery-mode="all"` (nereiks anotaciju mest klasem, kad uzregintu i contexta)
2. Susikurkit koki nors interface
3. Sukurkit bent 2 klases (kurios implementintu ta interface)
4. Viena is ju palikit be jokiu anotaciju, o visas kitas su `@Alternative`
5. Injectinkit interfeisa i kuria nors klase
6. beans.xml pridekit sita:
```
    <alternatives>
        <class>lt.vu.alternative.AlternativeGreeter</class>
    </alternatives>
```
Jeigu sito nebus - ims implementacija, kuri neturi `@Alternative`, priesingu atveju ims pagal classpatha, kuri nurodet 6 punkte

#### 3.2 CDI specialization (@Specializes) (0.1)
Susikuriat 
- interface A
@CustomQualifier
- class B implements A
@Specializes
- class C extends B

CustomQualifier patys susikuriat
+ reik pridet i bean.xml

```
@Inject
@CustomQualifier
private A a; // injectins C, nes turi @Specializes
```